0
点赞
收藏
分享

微信扫一扫

flask(六)----动态参数及路由注册方式

闲云困兽 2022-03-11 阅读 43

在前后台交互时,前端需要设置name属性,后端通过name属性去获取数据,然后逻辑处理,例如:<input name='get_action>' 

1.通过<id>可动态接收参数

可指定请求参数类型:string:(不能包含/),path:可以包含/,int,float,uuid

通过uuid可生产唯一识别码

import uuid
from flask import Flask
print(uuid.uuid4())     # 6378d59d-c502-4976-a140-05c6c61c807d
app = Flask(__name__)

@app.route('/login/<int:id>')   # 通过<id>可动态接收参数,可指定请求参数类型:string:(不能包含/),path:可以包含/,int,float,uuid
                                #
def index(id):
    return id

if __name__ == '__main__':
    app.run(debug=True)

2.通过request.arges接收参数。

3.在flask中,url:/login/和/login是不一样的

路由:路由就是url和视图函数的绑定关系。

路由注册机制:

1.装饰器注册:底层也是对add_url_rule进行封装的。

app.route('/login',methods=['post','get')]

        app.route中可通过methods参数指定此路由可接收的请求方法,也可以限制请求方法。

from flask import Flask

app = Flask(__name__)

@app.route('/login',methods = ['post','get'])   # 可通过methods参数指定此路由可接收的请求方法,也可以限制请求方法。   #
def index():
    return 'login'

def home():
    return 'home'

# 集中注册
app.add_url_rule('/home',view_func=home)    # 当项目很大,url较多,就推荐这种集中注册机制,若是下项目,就用app.route()装饰器注册

print(app.url_map)

if __name__ == '__main__':
    app.run(debug=True)
    # 输出:
    # Map([ < Rule'/login'(GET, HEAD, OPTIONS) -> index >,< Rule'/home'(GET, HEAD, OPTIONS) -> home >,< Rule'/static/<filename>'(GET, HEAD, OPTIONS) -> static >])

 

2.集中注册机制:当url较多时,可用专用rul.py模块来集中注册管理url

app.add_url_rule('/login',view_func=func,methods=['post'])

        add_url_rule可以将参数中的路由信息注册到app核心对象中。

app.url_map:

        flask中触发add_url_rule后会讲路由信息加入一个类似字典的url_map对象中。

from flask import Flask

app = Flask(__name__)

@app.route('/login')   # 通过<id>可动态接收参数,可指定请求参数类型:string:(不能包含/),path:可以包含/,int,float,uuid                            #
def index():
    return 'login'

def home():
    return 'home'

# 集中注册
app.add_url_rule('/home',view_func=home)    # 当项目很大,url较多,就推荐这种集中注册机制,若是下项目,就用app.route()装饰器注册

print(app.url_map)

if __name__ == '__main__':
    app.run(debug=True)
    # 输出:
    # Map([ < Rule'/login'(GET, HEAD, OPTIONS) -> index >,< Rule'/home'(GET, HEAD, OPTIONS) -> home >,< Rule'/static/<filename>'(GET, HEAD, OPTIONS) -> static >])

3.重定向:

        3.1 app.route(redirect_to='/'):不会执行app.route下面的视图函数

        3.2 视图函数中return redirect('/'):会执行视图函数。

from flask import Flask
from werkzeug.utils import redirect

app = Flask(__name__)


@app.route('/login', methods=['post', 'get'], redirect_to='/house')
def index():
    return 'login'


@app.route('/house', methods=['post', 'get'])
def house():
    return 'house'


@app.route('/home', methods=['GET'], endpoint='new')
def home():
    print('触发了home')
    return redirect('/house')


if __name__ == '__main__':
    app.run(debug=True)
    

4.默认参数设置:

        4.1 defaults={'id':5}

         4.2 视图函数中定义默认值

from flask import Flask

app = Flask(__name__)


@app.route('/login', methods=['post', 'get'])
def index(id=9):    # 视图函数中定义默认参数
    return f'{id}'


if __name__ == '__main__':
    app.run(debug=True)
# 输出:
# Map([ < Rule'/login'(GET, HEAD, OPTIONS) -> index >,< Rule'/home'(GET, HEAD, OPTIONS) -> home >,< Rule'/static/<filename>'(GET, HEAD, OPTIONS) -> static >])

5.视图函数的分离

python中解决两个模块相互导入造成的循环导入问题“:

        1. 在需要的地方再导入,不用在文件一开始就导入

        2.导入模块中的代码,不要只导入模块。 

举报

相关推荐

0 条评论