版权声明:Copyright © https://cloud.tencent.com/developer/article/1475777
flask 是由python语言实现的
特点:轻量,简洁,扩展性强
核心:werkzeug 和 Jinja2
为什么要配置虚拟环境?
各个项目有独立的运行空间,彼此互不影响,python解释器彼此互不影响.
__name__ 确定程序所在的位置 可以传入__main__,不能传入数值,可以传入字符串
route方法必须传入一个字符串形式的url路径,路径必须以斜线开始
url可以重复吗?视图函数可以重复吗?
url可以重复,url可以指定不同的请求方式
url 查找视图 从上往下执行,如果找到,不会继续匹配
视图函数不能重复,函数只允许有一个返回值
创建一个url 默认会有两个映射
特点: 动态加载代码,不用重启服务器,会调试错误信息;生产模式不能开启
本质: 把当前请求返回的响应,向其他url再次发送请求,跳转页面.
作用: 当项目文件或目录发生改变时,可以使用重定向.
缺点: redirect函数接收的参数为固定url,不建议直接使用,扩展性不强,需要配合url_for 实现重定向,接收的参数为函数名,
# 重定向
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def index():
a = 'https://www.baidu.com'
return redirect(a)
if __name__ == '__main__':
app.run()
# redirect + url_for
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/')
def center():
return 'hello Flask!'
@app.route('/get')
def geturl():
return redirect(url_for('index'))
@app.route('/c')
def index():
a = 'https://www.baidu.com'
return redirect(a)
if __name__ == '__main__':
app.run(port='8080')
return 后面可以自定义不符合http协议的状态码,实现前后端数据交互,也可以返回符合http协议的状态码,相当于修改了框架封装好的默认响应报文中的状态码
abort 函数接收的参数为符合http协议的状态码,作用为配合errorhandler修饰的函数必须传入参数,参数为错误异常,实现自定义错误页面
# 异常处理
from flask import Flask, abort
import flask_00.Configuration
app = Flask(__name__)
app.config.from_object(flask_00.Configuration.Config)
@app.route('/center')
def center():
abort(403)
@app.errorhandler(403)
def errorhandler(e):
return '服务器已经理解请求,但是拒绝执行它。'
@app.route('/')
def index():
return 'hello python',999
if __name__ == '__main__':
print(app.url_map)
app.run(port='8080')
JavaScript Object Notation
基于键值对的字符串,用来实现数据的传输
前端 —> json <—-python
JSON.parse(info): 把json转成对象
JSON.stringify(): 把对象转成json
json.dumps(info): 把字典转成json
json.loads(info): 把json转成字典
建议使用Flask封装的jsonfy方法,不仅返回json数据,可以指定响应的数据类型
<args> 固定参数,必须传给视图函数,转换器限制参数的数据类型
# 给路由传参数
# 语法格式 <args>
#网址后面输入参数
from flask import Flask
app = Flask(__name__)
@app.route('/<args>')
def index(args):
return 'hello %s' %args
if __name__ == '__main__':
app.run()
为什么自定义转换器?
已有的转换器无法满足需要,无法定义长度.
url?后面的,以=进行传参,以&进行分隔,叫做查询字符串
获取值 request.args.get(key)
获取表单数据 request.form.get(表单中字段的key)
获取表单的文件 request.files.get(表单中的文件key)
cookies: request.cookies.get(cookie的key)
属性 | 说明 | 类型 |
---|---|---|
data | 记录请求的数据,并转换为字符串 | * |
form | 记录请求中的表单数据 | MultiDict |
args | 记录请求中的查询参数 | MultiDict |
cookies | 记录请求中的cookie信息 | Dict |
headers | 记录请求中的报文头 | EnvironHeaders |
method | 记录请求使用的HTTP方法 | GET/POST |
url | 记录请求的URL地址 | string |
files | 记录请求上传的文件 | * |
两种请求前执行
两种请求后执行
请求上下文: 封装了客户端和服务器交互过程中的信息
应用上下文: 封装了程序运行过程中的一些配置信息,比如调用的函数,模块,加载的工具类,文件等
为什么要进行状态保持?
http协议是一种无状态协议,浏览器请求服务器是无状态的.
http协议底层是TCP/IP协议,三次握手,四次挥手,返回数据后会断开连接,下次链接相当于新的请求,不会记得刚刚的请求信息.
cookie :在服务器中生成,储存在浏览器中,不安全.
session:session_id储存在浏览器中,它的值存在服务器中,相对安全.
from flask import Flask,make_response,request
from setting import Config
app = Flask(__name__)
app.config.from_object(Config)
@app.route('/')
def hello_world():
# 使用响应对象,设置cookie
response = make_response('set cookie')
# 设置cookie,并制定有效期
response.set_cookie('name','python2',max_age=60)
return response
# 获取cookie
@app.route('/get')
def get_cookie():
name = request.cookies.get('name')
return name
@app.route('/hello')
def index():
return 'hello world'
# 状态保持---session:session基于cookie实现
# session数据存储在内存型数据库,redis、
# 设置session
@app.route('/set')
def set_session():
session['name']='python02'
return 'set session success!'
# 获取session
@app.route('/get_session')
def get_session():
name = session.get('name')
return name
if __name__ =='__main__':
app.run()
from flask import Flask
# 导入Flask_script扩展包
from flask_script import Manager
# 导入配置文件
from setting import Config
app = Flask(__name__)
app.config.form_object(Config)
# 实例化管理器对象
manager = Manager(app)
@app.route('/')
def hello_world():
return 'hello world!'
if __name__ == '__main__':
# 代替app.run()
# 在终端使用命令动态指定host和port,在生产环境下不用手动修改代码的host和port
# 在pycharm运行需要添加runserver参数
manager.run()
reader_template 函数调用了模板引擎Jinja2