一、路由
@app.errorhandler(404) def not_found(arg): print(arg) return "没找到" @app.route('/index') def index(): return "Index" ########### 添加路由的第二种方式 ########### def test(): return "Test" app.add_url_rule("/test", None, test) # flask中app.route函数会执行add_url_rule方法,一般只需要用第一种方法即可,第二种方法一般用于CBV中。
二、参数
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
例:
from flask import Flask, views import functools app = Flask(__name__) @app.route("/index") def index(): return "index" class UserView(views.MethodView): methods = ["GET"] decorators = ['wrapper'] # 为所有class中的方法批量添加装饰器 def get(self,*args,**kwargs): return "get" def post(self,*args,**kwargs): return "post" app.add_url_rule("/user",None,UserView.as_view("xxxxxx")) 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()
五、blueprint(蓝图)
目标:给开发者提供目录结构
其他:
- 自定义模板、静态文件
- 给某一类url添加前缀
- 给某一类url添加before_request
步骤:
1.创建项目名称bulueprint 2.在项目目录里面创建与项目一样的目录bulueprint 3.在二级bulueprint目录创建__init__.py文件 from flask import Flask def create_app(): app = Flask(__name__) return app 4.在项目目录下创建manage.py文件 from blueprint import create_app app = create_app() if __name__ == '__main__': app.run() 5.在二级目录bulueprint下创建目录views.py,里面定义我们自己的模块。这里创建account.py文件。 from flask import Blueprint, render_template # template_folder可自定义模板目录,但是优先从templates目录查找 ac = Blueprint("ac",__name__) # 为单独的请求添加装饰器,这里为只处理ac跳转的路由 @ac.before_request def x1(): print('before_request') @ac.route('/login') def login(): return render_template("login.html") 6.在__init__.py文件中引入模块,并注册。 from flask import Flask from .views.account import ac def create_app(): app = Flask(__name__) app.register_blueprint(ac) # url_prefix,强行添加前缀,访问http://127.0.0.1:5000/api/list,可以用于控制版本 return app 7.像django一样,在二级目录bulueprint下创建目录templates和static,定义静态资源。