- 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kun1280437633/article/details/80247122
1、response: 用来响应客户端的数据,返回的时候有两种形式指定:
(1) 直接返回元祖的形式
a. 直接返回, 响应体 return "hello"
b. 返回 响应体+状态码 return "hello", 999
c. 返回 响应体 + 状态码 + 响应头
(2) 第二种返回reponse对象的形式 response = make_response( )
2、当服务器向浏览器设置数据的时候,可以指定格式(例json):
(1) 直接指定headers,里面的Content-Type 为application/json
(2)使用jsonify, 也可以,flask自带的
代码:
from flask import Flask,make_response, jsonify
app = Flask(__name__)
@app.route('/')
def work1():
# response = make_response()
# response.headers['Content-Type'] = 'application/json'
# return response
# dict = {
# "name": "zhangsa"
# }
# return jsonify(dict)
return jsonify({'name': "zhang", 'age': 14})
# return jsonify(name="zhangsan", age=14)
if __name__ == '__main__':app.run(debug = True)
3、请求钩子:在访问某些视图函数的时候,会顺带着执行,请求钩子所修饰的方法
常见的请求钩子有四中:
(1) before_first_request,第一次请求的时候会执行,初始化操作,比如:数据库的链接,权限过滤
(2) before_request,每次请求前执行,统一指定该资源和浏览器的交互过程
(3)after_request,每次请求后执行,统一指定该资源和浏览器的交互过程
(4)teardown_request,每次请求销毁后, 用来记录服务器的异常信息
4、反向解析(可以根据视图函数的名字找到所对应的路由路径)
格式:url_for('函数名字',key=value)
注意点:
(1)当使用url_for传递参数的时候,可以直接通过request.args方式去获取
(2)如果当成路径传递,那么解析的路径中的参数, 必须要与传递的参数完全一致,可以有两种情况接受
代码:
from flask import Flask,redirect,request,url_for
app = Flask(__name__)
@app.route('/work1')
def work1( ):
return 'hello'
@app.route('/<int:id>')
def work2(id):
return "<a href='%s'>哈哈</a>"%url_for('work3',token =id)
#方法一
# @app.route('/work/<int:token>')
#方法二
# @app.route('/work<int:token>')
# def work3(token):
# if token ==12:
# return 'nihao'
# else:
# return redirect('/work1')
#方法三
@app.route('/work')
def work3():
token = request.args.get('token')
if token == "12":
return 'nihao'
else:
return redirect('/work1')
if __name__ == '__main__':
app.run(debug=True)
5、存储cookie和session
(1)cookie:用来记录用户和服务器的交互数据,比如,链接的状态信息,sessionID,csrf_token, 由服务器进行设置
(2)cookie的设置:response.set_cookie(key,value,maxAge): maxAge表示过期时间, 如果不设置默认一次回话结束
(3)cookie的获取: request.cookies[key]
(4)session: 用来存储客户的铭感信息, 比如:密码,状态信息等, 浏览器访问,服务器存储
(5)设置session: session[key] = value
(6) 获取session: session[key], session.get(key)session注意点:
<1>. session空间的编号sessionID,会存储在cookies
<2>. sessionID的生成依赖于SECRET_KEY
代码:
from flask import Flask,session, make_response, request
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie( ):
response = make_response('set_cookie')
response.set_cookie('name', 'zhangsan')
response.set_cookie('age', '13', 10)
return response
@app.route('/get_cookie')
def get_cookie():
# 如果使用中括号的形式获取,不存在就会报错, 如果使用get,不存在返回none
name = request.cookies['name']
age = request.cookies.get('age')
return 'name is %s,age is %s'% (name, age)
@app.route('/set_session/<path:name>')
def set_session(name):
session['name'] = name
session['age'] = 14
return 'hellloworld'
@app.route('/get_session')def get_session():
name = session['name']
age = session.get('age')
return 'name is %s,age is %s'%(name,age)
if __name__ == '__main__':
app.run(debug=True)
6、请求上下文和应用上下文
(1)请求上下文:
<1>.request: 用来封装浏览器的参数信息,可以理解成一个线程的局部变量
<2>.session: 用来记录浏览器访问服务器的敏感信息.(2) 应用上下文:
current_app: 相当于是app的一个代理,主要是用于模块化开发,和整个整个应用程序相关
g: 和某一次的请求相关,只要这一次请求没有结束,g对象都有效. (配合装饰器使用)
7、flask并没有提供复杂的功能,只有基本的路由映射(Werkzeug)和模板渲染功能(jinja2)
如果想要使用额外的功能,需要使用扩展包:安装: pip install flask_script
有两点作用:
(1)在部署更换服务器的时候,不需要修改源代码就可以指定ip端口运行
使用流程:
1. 安装,导入包
2. 通过Manager管理app
3. 通过manager对象来运行程序
4. 运行命令: python xxx.py runserver -h ip地址 -p 端口(2) 进行数据库的迁移操作(后面再讲解)
代码:
from flask import Flask,current_app
from flask_script import Manager
app = Flask(__name__)
#设置debug
#方法一
# app.debug=True
#方法二
# class Config(object):
# DEBUG = True
# app.config.from_object(Config)
# 方法三
app.config.from_pyfile('./config.ini') # config.ini是文件里面写 DEBUG = True
#2通过Manager管理app
manager = Manager(app)
@app.route('/')
def work1():
print current_app.url_map
return'hello'
if __name__ == '__main__':
# app.run(debug=True)
manager.run()
8、模板(jinja2中提供了自带的模块渲染引擎,模板说白了就是html文件)
使用模板的流程:
(1) 创建html文件,位于: templates,因为创建app对象的时候templates_foleder默认是templates
(2)使用render_template("模板文件名",key=value)
模板的语法格式 :
(1)获取变量的值 {{ 变量名 }}
(2)分支语句if {% if 条件 %} {% endif %}
(3)循环语句for {% for 变量名 in 容器 %} {% endfor %}
(4)注释 {#注释#}
9、过滤器(jinja2模板中自带了一些常见的过滤器: 相当于python的函数一样)
字符串过滤器:
reverser: 反转
upper: 大写
lower: 小写
title: 所有所字母都大写....
列表过滤器:
first:第一个
last:最后一个
length:个数
sum:求和
自定义过滤器: 当jinja2提供的模板满足不了需求的时候,需要自定义
自定过滤器有两种格式:
(1)第一种格式:
<1>.先编写视图函数
<2>.然后使用app.add_template_filter(函数,"过滤器名字")(2)第二种格式:
<1>.直接使用@app.template_filter("过滤器名字")装饰函数代码:
from flask import Flask,render_template
app = Flask(__name__)
@app.template_filter('ss')
def work3(ls):
return ls[::2]
def work2(ls):
list = []
for i in ls:
if i % 2 == 0:
list.append(i)
return list
app.add_template_filter(work2,'even')@app.route('/')
def work1():
return render_template('file03.html',mylist = [x for x in range(0,10)])
if __name__ == '__main__':
app.run(debug=True)
10、宏
macro:可以理解为python中的函数, 在需要的时候调用,封装了一段功能
定义宏: {%macro 宏名()%} {%endmacro%}
调用宏:
(1)当前文件: {{ 宏名(参数) }}
(2)其他文件: {% import '宏文件' as 别名%} {{ 别名.宏名(参数) }}
11、继承和包含
(1)继承: 共性抽取,代码复用
{% extends '文件名' %}
如果不想使用父类内容可以重新覆盖
{% block 父类名称 %}
{% endblock%}
(2)包含: 针对不变的内容进行包含
{% include '文件名'%}
{% include '文件名' ignore missing%}