《Flask Web开发实战》 第二章
Flask与HTTP
1. 请求响应循环
服务端与客户端之间的通信:
客户端访问URL,浏览器生成对应的HTTP请求,由互联网发送到对应的Web服务器。Web服务器接收请求通过WSGI将HTTP格式的数据转化成Flask能够使用的python数据
2. HTTP请求
2.1 请求报文 (计网知识,略过)
2.2 request 对象
使用request能够获取请求报文中的参数,关于参数列表可以查看官方文档。
示例:
from flask import Flask, request
@app.route('/hello')
def hello():
name = request.args.get('name','Flask') # 第二个值为默认值,如果没有获得参数则返回Flask
return name
2.3 请求处理
将URL请求与其视图函数对应
-
路由匹配
Flask通过一个路由表来实现实例的存储app.url_map
.使用flask routes
命令可以查看所有路由
可以看到endpoint的设置在这里可以显示,url_for
可能就是在这里找的名称。 -
设置监听HTTP方法
也就是监听GET和POST
@app.route('/',methods=['GET','POST'])
def ...
这样就能够判断进来请求的对应方法,如果只允许GET而提交POST请求则返回405错误。通过该方法能够为一个URL设置多个视图函数规则。
-
URL处理
用于将URL的一部分变量进行转换/index/<int:year>
,能够将接收到的年份转换为int,否则为字符串变量,如果传入的是英文,则返回404.
默认可以是string,int,float,path,any,uuid
也可以用来自定义,可以看前面的博客。 -
请求钩子
能够用来对请求进行预处理和后处理(有点像监听器?)
默认的钩子:
before_first_request
:在运行程序前进行的一些初始化操作,必出创建数据库表等
before_request
:记录用户最后在线的时间,可以通过用户发送的请求时间来实现
after_request
:在视图函数中进行数据库操作,可以将提交的代码放到该函数中
after_this_request
teardown_request
:即使有异常抛出也会在请求结束后运行,如果发生异常,会将异常对象作为参数到函数中。
3 HTTP响应
3.1 响应报文
3.2 在Flask中生成响应
在大多数情况下,大部分内容交给服务器去处理,我们只负责返回主体内容。FLask能够调用make_response()方法将视图函数转换为响应对象。
视图函数返回最多可以由三个元素组成的元组:响应主体、状态码、首部字段。
# 以重定向为例
@app.route('/hello')
def hello():
...
return '',302,{'Location','http://www'}
# 用location来指定重定向地址
- 重定向:
浏览器接收到重定向响应后会向Location字段中的目标URL发起新的GET请求。应用场景:某个用户在没有经过认证的情况下访问需要经过登录后才能访问的资源。
在FLask中可以使用redirect()
函数来生成重定向响应,默状态码为302. - 错误响应:
自定义返回错误类型,使用abort
def not_found():
abort(404)
- 响应格式:
不同的响应数据格式需要设置不同的MIME类型。
Content-Type:text/html
在Flask中可以用response.mimetype = 'text/plain'
来设置。
几种常见的MIME类型:
text/plain text/html application/xml application/json
3.3 Cookie
Cookie通过在响应和请求报文中添加Cookie数据来保存客户端的状态信息。
示例:
from flask import FLask,make_response
...
@app.route('/set/<name>')
def set_cookie(name):
response = make_response(redirect(url_for('hello'))) # 为这个网页创建一个响应
response.set_cookie('name',name) # 设置cookie
return response
cookie可以通过request。cookies.get('name',name) 来进行获取。
使用cookie会有一个问题,由于cookie是一个比较容易手动添加和修改的字段,因此会存在安全问题。可以通过session来进行加密存储。
session通过秘钥对来对数据进行加密。
app.secret_key = 'secret string'
# 或者使用 get 放到系统环境变量中 SECRET_KEY=secret string
import os
app.secret_key = os.getenv('SECRET_KEY',`secret string`)
# 如何使用
@app.route('login')
def login():
after login
session['logged_in'] = True
return redirect(url_for('endpoint'))
from flask import request,session
@app.route('/')
@app.route('/hello')
def hello():
name = request.args.get('name')
if name is None:
name = request.cookies.get('name','Human')
response = 'hello %s' %name
if 'logged_in' in session:
response += '[Au]'
else:
response += '[Not Au]'
return response
@app.route('/logout')
def logout():
if'logged_in' in session:
session.pop('logged_in')
return redirect(url_for('hello'))
# REPMANENT_SESSION_LIFETIME 可以控制session的有效时间
# 即使使用session,也只能够保证session的内容不会被篡改,而仍可以通工具进行读取
4 FLask上下文
我们可以把编程中的上下文理解为当前环境的快照,Flask中有两种上下文,请求上下文和程序上下文
在引入request后,处理请求时request会自动包含对应请求的数据?,因为Flask会在每个请求后自动激活当前请求的上下文。当请求结束后,Flask就销毁对应的请求上下文。
5 小实战
5.1 返回上一次浏览的地址
def redirect_back(default='hello',**kwargs):
for target in request.args.get('next'), request.referrer:
if not target:
continue
if is_safe_url(target):
return redirect(target)
return redirect(url_for(default,**kwargs))
def is_safe_url(target):
ref_url = urlparse(request.host_url) #获取程序内的主机URL
test_url = urlparse(urljoin(requset.host_url,target)) #将目标URL转化为绝对URL
return test_url.scheme in('http','https') and ref_url.netloc == test_url.netloc # 在内部的URL才能被接收
5.2 AJAX技术
指异步Javascript和XML,能够在不重载页面的情况下进行数据交互
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)