flask路由+视图

一、路由

@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,定义静态资源。

 

posted @ 2019-06-18 21:52  酷酷的狐狸  阅读(219)  评论(0编辑  收藏  举报