本文概要,由于最近学Flask,因此总结下,有利于以后复习
一、Flask介绍
二、第一个Flask程序
三、修改配置文件
四、页面跳转和重定向
五、关于模板问题
六、使用for循环遍历值
七、继承和使用block
八、加载静态文件
九、Session和Cookie
十、POST请求
十一、Context_processor装饰器
一、Flask介绍
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
二、第一个Flask程序
from flask import Flask
#初始化Flask对象_name_
app = Flask(__name__)
#app.route是一个装饰器,做一个url与视图函数的映射
#127.0.0.1:5000/请求 hello_world函数,返回给浏览器
@app.route('/')
def hello_world():
return 'Hello Flask!'
if __name__ == '__main__':
#启动应用服务器接收请求.
#默认127.0.0.1,端口5000
app.run()
三、修改配置文件
一些需要配置的信息可以放在配置文件中,如数据库的初始化等等.
import config #新建一个config.py文件
app.config.from_object(config) #导入配置信息
四、页面跳转和重定向
import url_for,redirect
from flask import Flask,redirect,url_for
app = Flask(__name__)
@app.route('/')
def index():
Url_for = url_for('login') #获取login函数的url
return redirect(Url_for) #跳转到该url
@app.route('/login/')
def login():
return '这是登陆界面'
#可以使用<id>传输参数
@app.route('/question/<islogining>/')
def question(islogining):
if islogining=='1':
return u'这是问答界面'
else:
return redirect(url_for('login'))
if __name__ == '__main__':
app.run(debug=True)
五、关于模板问题
如何渲染模板:
from flask import render_template #导入模板类
@app.route('/')
def index():
class Person(object):
age = 18
p = Person()
context = {
'username' : u'lin',
'gender' : u'male',
'person':p #字典属性可以是一个类
}
return render_template('index.html',**context) #传多个参数
<p>name : {{ username }}</p>
<p>gender : {{ gender }}</p>
<hr>
<p>age : {{ person.age }}</p>
六、使用for循环遍历值
from flask import render_template #导入模板类
@app.route('/')
def index():
book = [
{
'bookname': u'西游记',
'price': 50,
'author': u'吴承恩'
},
{
'bookname': u'红楼梦',
'price': 30,
'author': u'曹雪芹'
}
]
return render_template('index.html',bookName=book)
<table>
<thead>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</thead>
<tbody>
<!--if也可以,注意闭合-->
{% for book in bookName %}
<tr>
<td>{{ book.bookname }}</td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
七、继承和使用block
子类继承父类,子类拥有父类的方法,比如相同的主页模板可以使用继承.
{% extends 'base.html' %} #定义一个接口
接口名字,block,Tab键一键补充。
在父类中写以下,表明把该地方有子类方法。
在子类中写如下,表明实现该方法。
{% block main %}
{% endblock %}
八、加载静态文件
静态文件放在static目录下,可以有css,js,image等.
<link rel="stylesheet" href="{{ url_for('static',filename='css/index.css') }}">
九、Session和Cookie
Cookie存储在客户端,把用户id存放到cookcie
Session存储在服务器,将用户信息经过加密后存放在session,并且产生唯一的session_id,session可以设置过期时间,通过cookie与浏览器端交互。
Flask中Session的工作机制
把敏感数据经过加密后放入Session,存放到cookie中,下次请求时候,再从浏览器发送过来的cookie中读取session,然后再从session中读取敏感数据解密,获取最终数据,节省服务器开销,把信息存储在客户端了。
操作Session
from flask import session
@app.route('/')
def index():
session['username'] = 'You'
return "Hello World"
@app.route('/get/')
def get():
return session.get('username') #返回session.id
#若需要删除session,则session.pop('username')
#若需要删除所有session,则session.clear()
设置一定时长的过期时间
from flask import session
from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
session.permanent = True #7天的时间
十、POST请求
默认视图函数采用get,
@app.route('/login/',methods=['GET','POST'])
def login():
if request.method == 'GET': #判断用户是否登录,第一次默认使用GET
return render_template('login.html')
else:
username = request.form.get('username')
password = request.form.get('password')
十一、Context_processor装饰器
解决多个页面传同样参数问题
上下文处理器返回字典,key会被当变量渲染,在所有页面都会用到。
装饰器实际上是一个函数
特点,参数是一个函数
返回值是一个函数
@app.context_processor
def my_context_processor():
username = session.get('username')
if username:
return {'username':username}
return {}