路由和视图
程序员文章站
2022-06-17 10:47:10
...
title: 路由和视图
date: 2018-10-29 11:06:17
tags: flask
categories: 十月,2018
什么是wsgi?
web服务网关接口,wsgi是一个协议,实现该协议的模块:
- wsgiref
- werkzeug
实现其协议的模块本质上就是socket服务端用于接收用户请求,并处理
一般web框架基于wsgi实现,这样实现关注点分离。
wsgiref示例:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8000, run_server)
httpd.serve_forever()
wsgizeug示例:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
def run_server(environ, start_response):
response = Respoense('hello')
return response(environ, start_response)
if __name__ == '__main__':
run_simple('127.0.0.1', 8000, run_server)
Flask源码入口:
from werkzeug.wrappers import Response
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self,environ, start_response):
response = Response('hello')
return response(environ, start_response)
def run(self):
run_simple('127.0.0.1', 8000, self)
app = Flask()
if __name__ == '__main__':
app.run()
Flask 提供功能
- 配置文件
- 所有配置都在app.config中
- app.config["xx"] = 123
- app.config.from_object("类的路径")
- 应用:importlib、getattr
- django中间件
- rest framework全局变量
- session
- 加密后放置在用户浏览器的cookie中
- 流程:
- 请求到来
- 视图函数
- 请求结束
- 配置文件
- 闪现
- 基于session实现
- 路由
- 装饰器(带参数)
- 自定义装饰器放下面
- 参数
- url_for
- 视图
- FBV
- 请求和响应
- 请求:request
- 响应:4种(字符串、Response对象、重定向类型redirect()、错误码处理abort(404))
- 模板
- ......
- 特殊装饰器
- before_first_request
- before_request
- after_request
- template_global()
- template_filter()
- errorhandler(404)
- 中间件
路由和视图
- 路由 + 视图
- 路由设置的两种方式:
- @app.route('/xxx')
def index():
return "index"
- def index():
return "index"
app.add_url_rule("/xxx",None,index)
- 注意事项:
- 不能让endpoint重名
- 如果重名函数也要重名
- 参数
- rule, URL规则
- view_func, 视图函数名称
- endpoint=None, 名称,用于反向生成URL,即: url_for('名称')
- methods=None, 允许的请求方式,如:["GET","POST"]
- strict_slashes=None, 对URL最后的 / 符号是否严格要求,
- redirect_to=None, 重定向到指定地址
- defaults=None, 默认值,当URL中无参数,函数需要参数时,使用defaults={'k':'v'}为函数提供参数
- subdomain=None, 子域名访问
- CBV
import functools
from flask import Flask, views
app = Flask(__name__)
def wrapper(func):
@functools.wraps(func)
def inner(*args, **kwargs):
return func(*args **kwargs)
return inner
class UserView(views.MethodView):
methods = ['GET']
decorators = [wrapper,]
def get(self, *args, **kwargs):
return 'GET'
def post(self, *args, **kwargs):
return 'POST'
app.add_url_rule('/user', None, UserView.as_view('uuuu'))
if __name == '__main__':
app.run()
- 自定义正则:
from flask import Flask,url_for
app = Flask(__name__)
# 步骤一:定制类
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
"""
return int(value)
def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
"""
val = super(RegexConverter, self).to_url(value)
return val
# 步骤二:添加到转换器
app.url_map.converters['reg'] = RegexConverter
"""
1. 用户发送请求
2. flask内部进行正则匹配
3. 调用to_python(正则匹配的结果)方法
4. to_python方法的返回值会交给视图函数的参数
"""
# 步骤三:使用自定义正则
@app.route('/index/<reg("\d+"):nid>')
def index(nid):
print(nid,type(nid))
print(url_for('index',nid=987))
return "index"
if __name__ == '__main__':
app.run()