flask的自定义转换器
1.导入from werkzeug.routing import BaseConverter
2.写个类继承BaseConverter,实现三个方法:def __init__,def to_python, def to_url
3.将上面的类注册到app.url_map.converters['regex'] = RegexConverter中
4.在路由转换器中使用3中的regex("传正则")
5.当路由被访问后,regex("传正则")会匹配结果,把结果传递给to_python,可以进行再次处理,to_python处理好的结果,会传递给响应函数的形参
6 当用url做反向解析的时候,传递给路由转化器的参数,会经过to_url,进行处理,处理以后,再拼接到路由
代码:
from flask import Flask, url_for
from werkzeug.routing import BaseConverter
app = Flask(import_name=__name__)
class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
"""
print("to_python",value,type(value))
return int(value)+1
def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
"""
val = super(RegexConverter, self).to_url(value)
return val+"222"
# 添加到flask中
app.url_map.converters['regex'] = RegexConverter
# 正则匹配处理结果,要交给to_python,to_python函数可以对匹配处理结果做处理
@app.route('/index/<regex("d+"):nid>')
def index(nid):
print("index",nid,type(nid))
print(url_for('index', nid='888'))
return 'Index'
if __name__ == '__main__':
app.run()
flask的模板渲染
from flask import Flask, render_template, Markup
app = Flask(__name__)
app.debug = True
USERS = {
1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}
def func1(arg):
return Markup(f"<h1>god is handsome, {arg} am sb</h1>")
@app.route("/")
def index():
return render_template("index.html", user=USERS, name='godsee', ht1=func1, ht="god is handsome")
# 或者
# data = {
# "user": USERS,
# "name": "godsee"
# }
# return render_template("index.html", **data)
if __name__ == '__main__':
app.run()
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>我是html文件</h1>
<br>
<table>
{% for k,v in user.items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v.name }}</td>
<td>{{ v['age'] }}</td>
<td>{{ v.get('text') }}</td>
<td>{{ url_for('index') }}</td>
</tr>
{% endfor %}
</table>
<br>
<div>{{name}}</div>
<br>
{% if name == 'tank' %}
<h1> is sb</h1>
{% else %}
<h1> is dsb</h1>
{% endif %}
<br>
{{ ht|safe }}
<br>
{{ht1('I')}}
<br>
</body>
</html>
图展:
flask的请求与响应
from flask import Flask,request,make_response,render_template,redirect
app = Flask(__name__)
@app.route("/",methods=["POST","GET"])
def index():
# 请求相关的信息
# print("请求方法",request.method)#请求方法
# print("get请求的参数",request.args)# get请求的参数
# print("post请求的参数",request.form) #post请求的参数
# print("post,与get的所有参数",request.values)#post,与get的所有参数
# print("请求的cookies",request.cookies)#请求的cookies
# 请求相关信息
# request.method 提交的方法
# request.args get请求提及的数据
# request.form post请求提交的数据
# request.values post和get提交的数据总和
# request.cookies 客户端所带的cookie
# request.headers 请求头
# request.path 不带域名,请求路径
# request.full_path 不带域名,带参数的请求路径
# request.script_root
# request.url 带域名带参数的请求路径
# request.base_url 带域名请求路径
# request.url_root 域名
# request.host_url 域名
# request.host 127.0.0.1:500
#关于响应我们已经将了4剑客,如果添加响应头,以及cookie
#要添加这些东西必须,导入make_response,
response = make_response("ok")
#response = make_response(render_template("login.html"))
#response = make_response(redirect("/login"))
#设置cookie
#response.set_cookie("key","val")
#如何删除cookie
#response.delete_cookie("key")
# 如何设置响应头
response.headers["x-somexx"] = "A SB"
return response
图片展示: