flask 是pythonweb框架之一 相比于django之类的重型框架 已经为你配置好很多内容 flask可以作为微型框架 微不代表他小 而是代表他的内容可以被你自己定义
响应和请求
我们在布置web服务器后 用户访问一个url 浏览器便会生成相对应的HTTP请求 由互联网发送到web服务器 服务器接收请求 flask根据请求的url执行对应的视图函数 视图函数运行并返回相对应的结果 包含html浏览器识别的语言 便是响应 浏览器在接收到响应 最终把响应的结果解析并渲染后的页面呈现给用户
url 组成部分 http://127.0.0.1/hello?name=tom
url组成 | 内容 |
---|---|
http:// | 为协议字符串 有http https 等 |
127.0.0.1 | 为服务器的地址 如果配置了域名 可以为 www.baidu.com |
/hello?name=tom | 资源路径 在视图函数的路由地址 也包含reques字段 |
HTTP请求
请求报文中含有 |请求方法 url 协议版本 头字段
请求组成 | 请求内容 |
---|---|
请求方式 | get post put等 |
请求url | 路由地址 |
请求头字段 | headers { 请求包含的内容字段 } |
报文主题 | name = tom&id = 123456 |
在请求requset中封装了请求的内容 通过导入flask.requset包 用 requset.args[‘key’]来获取字段的内容.
常见的request方法有
方法 | 说明 |
---|---|
args | 储存解析后查询的字符串 可以通过键值对获取相应的键值 |
cookies | 包含请求提交的cookies字典 |
data | 字符串形式的储存数据 |
endpoint | 请求对应的端点值 |
form | 解析后的表单数据 比如请求输入的表单内容为查询 |
get_data | 请求的默认读取字节字符串 |
get_json | 解析json并返回数据 |
headers | 头字段 |
method | 请求的方法 |
referrer | 请求发起源url |
scheme | 请求发起url的协议 |
user_agent | 用户代理 客户端主机内容操作系统等 |
路由映射 每个url地址对应一个视图函数 其映射关系储存在url_map中 当请求出现的时候flask会根据请求的url找到相对应的视图函数 如果没有此视图函数 flask会自动返回一个404错误请求
url_map示例
Endpoint | Methods | Rule |
---|---|---|
hello | GET | /hello |
hi | GET | /hello |
register | POST | /register |
url中还包含了了其他内容 可以作为动态访问的地址 /time/flask处理url地址的时候 解析< >中的内容 并把内容转化为int类型
转换器类型 | 内容 |
---|---|
string | 字符串 |
int | 整型 |
float | 浮点 |
path | file地址 |
请求钩子
flask对于客户端访问url之前可以支持预处理 就是请求钩子
before_first_request : 在处理第一个请求之前运行
before_request : 在处理请求之前运行
after_request : 处理请求之后 没有异常抛出 运行
teardown_request : 即使有未处理的异常抛出 也会运行
after_this_request : 在指定的请求结束之后运行
使用方式和app.route(’/’)相同每个钩子可以处理多个请求 作为装饰器在函数的上方使用
使用场景
before_first_request : 数据库初始化操作 添加管理员等
before_request : 用户记录时间 验证等
after_request : 数据库保存操作
teardown_requset : 回调数据库
请求钩子的运行顺序
HTTP响应
响应报文
组成 | 内容 |
---|---|
响应状态码 | 200 301 404 502 等 |
响应头 | {date:1111, sever:1111222} 等 |
报文主体 | 响应的字段或者html |
状态码常见的有
状态码 | 内容 |
---|---|
200 | 被正常处理 |
201 | 请求被处理,并创建资源 |
204 | 请求正常但是没有内容返回 |
301 | 永久重定向 |
302 | 临时重定向 |
304 | 重定向到缓存的资源 |
400 | 请求无效 存在错误 |
401 | 请求需要认证 |
403 | 请求被拒绝 |
404 | 请求错误 未找到正确的url地址 |
500 | 服务器错误 |
用户如果正常访问到正确的url地址 , flask自动调用make_response返回正确的状态码 默认为200
如果想重定向自定义地址 开发人员可以调用redirect() 函数来重定向 重定向的目标第一个参数为url地址 默认状态码为302 第二个参数可以传入301 修改为永久重定向 如果在程序内重定向到其他视图 在redirect( )函数中添加url_for( ) 传入url地址
使用示例
from flask import Flask, redirect, url_for
@app.route('/hi')
def hi():
return redierct(url_for('hello')) # 重定向到/hello
@app.route('/hello')
def hello():
return '<p>hello boy</p>'
flask 还提供错误码的返回 开发可以调用 abort( ) 传入参数状态码 404 或 403 返回错误 abort( )函数不用return 一旦执行abort 函数 后面的代码将不会继续执行
响应格式
在响应头中定义 content-Type: text/html ; charset=utf-8返回响应内容格式
也可以调用make_response( ) 生成响应对象
在响应的内容中可以有几种类型
纯文本 : text/plain类型
html : text/html 超文本标记语言
xml : application/xml 可扩展标记语言 一般作为ajax请求响应格式
json : application/json JavaScript交换数据格式
此外flask提供函数jsonify( ) 只需传入参数 python就会判断类型自动进行序列化返回正确的格式
cookies
服务器为了储存某些数据 比如认证 浏览器会自动保存 在下一次请求会附带cookie 然后服务端会根据cookie分析是否为本人 或分析用户的喜好等
在flask中 响应中可以添加cookie 方法为Requset类提供set_cookie( )方法
set_cookie( )方法定义了一下属性
属性 | 内容 |
---|---|
key | 键 |
value | 键对应的值 |
max_age | 保存的时间数 默认回话结束关闭后结束 |
secure | 若为True 只有https可用 |
httponly | 若为True 禁止JavaScript获取cookie |
开发人员在查询cookie的时候可以使用request.cookie.get(key,value)获取键值
cookie在文中最重要的作用就是用户在经过登录认证信息 服务端如果验证成功 就会返回一个cookie
比如login_user : tom , password : 123456 响应在被浏览器接收后 就会将cookie 保存在浏览器中 下一次访问便可以判断用户的身份
但是一个安全问题便是 cookie的值是可以手动更改的 如果 服务端直接将cookie设置为明文 那么便可以伪造cookie 的内容来获得网站的权限 为了避免出现此类情况 开发人员需要对cookie的内容进行加密处理 flask提供session对象将cookie数据加密储存
1.设置密钥 通过Flask.secret_key属性或配置setting文件中变量 SECRET_KEY设置密钥 (密钥使用暂时不会再议)
应用上下文和请求上下文
程序在分派请求之前激活应用和请求上下文,请求处理完成后将其删除 应用上下文激活后可以在线程中查找到g 和 current_app 请求上下文被推送后 可以在应用中找到request 和 session 如果没有激活任何一个就会报错
请求在程序中的运行顺序为 :
1.当一个请求出现时 flask 会吧请求实例化 成Request对象 同时激活请求上下文 RequestContext
2.然后检查在_app_ctx中是否有APP对象 如果没有就实例化APP 同时激活应用上下文APPContext 把app推送到 _app_ctx中 这时便可以在应用上下文中找到 g 和 current_app
3.再次检查_app_ctx中是否有APP对象 如果有就把Request推送到 _request_ctx中
4.这时就可以在_request_ctx 中找到Request对象 这时可以在请求上下文中找到 request 和 session
在手动实验推送应用上下文和请求上下文的方法是
app_ctx . push( ) 推送应用上下文
app_ctx . pop( ) 弹出应用上下文
request . push( ) / test_request_context( ) 推送请求上下文
request . pop( ) 弹出请求上下文
上页url操作
用户在登录后需要返回地址
1 . request . referrer 可以获取到上一页的url
2. 可以在url中加入 next 参数
使用方式 return redirect( request . args . get [‘next’]) 或者 return redirect( request . referrer)
获取上一页的url 因为安全问题 需要进行验证操作
url 安全验证:
flask 提供验证安全url的函数 urllib.parse
ref_url = urlparse(request.主机url)
test_url = urlparse(urljoin(request.主机url,传入url))
if ref_url.netloc == test_url.netloc:
return True
ajax技术
在web中 , 每次用户访问一个地址 浏览器就会发送一个请求给服务端 服务端接收到请求然后经过处理返回相应的字段 html文件 但是如果在同一个页面中 用户如果仅访问一个块的内容 返回给服务端 如果服务端还返回整个网页的html 就会浪费很大的资源 这是 ajax技术便得以应用
ajax可以在使用JavaScript更新页面的时候 改变对应的页面元素
ajax(函数支持的参数)
参数 | 说明 |
---|---|
url | 请求地址 |
type | 请求方式 |
data | 数据 |
dataType | 数据类型 |
contextType | 内容类型 |
complete | 请求完成后的回调函数 |
success | 请求成功后的回调函数 |
error | 请求失败后的回调函数 |
ajax 使用示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标题</title>
</head>
<body>
<h1>正文字段</h1>
<div class="body">{{ text }}</div> //这里插入body字段
<script src="jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$('#load').click(function () { //定义函数名称
$.ajax({
url:'hello', //url
type:'get', //get方法
success:function (data) { //如果响应成功就出发回调函数
$('.body').append(data); //返回响应插入到页面中
}
})
})
})
这边不熟太懂 后边深入研究ajax
资料来源于李辉-flask开发实战 若侵权 请联系
qq : 1759435876
微信 : 17711405764
我将第一时间删除并道歉 谢谢 !