0
点赞
收藏
分享

微信扫一扫

【Flask】路由-视图补充

英乐 2022-06-23 阅读 79
  1. 路由设置的两种方式
#第一种
@app.route('/xxx')
def index():
return "index"
#第二种
def index():
return "index"
app.add_url_rule("/xxx",None,index) #第一个参数为路径,第二个参数为endpoint为None,第三个为index函数名
  1. ​app.route()​​当中可以包含的参数
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, 子域名访问

(1)参数defaults用法

@app.route('/xxx',defaults={'v':123})
def index(v):
return "index"

(2)参数redirect_to用法

@app.route('/xxx', redirect_to="/new")
def index(v):
return "index"

(3)参数subdomain用法

from flask import Flask, views, url_for

app = Flask(import_name=__name__)
app.config['SERVER_NAME'] = 'wupeiqi.com:5000' #需要手动设置本地host文件,加入以下对应关系
"""
127.0.0.1 wupeiqi.com
127.0.0.1 web.wupeiqi.com
127.0.0.1 admin.wupeiqi.com

"""

# http://admin.wupeiqi.com:5000/
@app.route("/", subdomain="admin")
def admin_index():
return "admin.your-domain.tld"


# http://web.wupeiqi.com:5000/
@app.route("/", subdomain="web")
def web_index():
return "web.your-domain.tld"


# http://sdsdf.wupeiqi.com:5000/
# http://sdfsdf.wupeiqi.com:5000/
# http://asdf.wupeiqi.com:5000/

@app.route("/dynamic", subdomain="<username>")
def username_index(username):
"""Dynamic subdomains are also supported
Try going to user1.your-domain.tld/dynamic"""
return username + ".your-domain.tld"

if __name__ == '__main__':
app.run()
  1. CBV模式实现,一般在flask中视图用FBV
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'

def b(self):
return 11

app.add_url_rule('/user',None,UserView.as_view('uuuu')) #学了django的cbv模式才能理解,第三个参数里的参数'uuuu'相当于endpoint,这里没有定义响应函数uuuu

if __name__ == '__main__':
app.run()
  1. 自定义正则
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>') #在reg()中编写正则表达式
def index(nid):
print(nid,type(nid))

print(url_for('index',nid=987)) #调用to_url方法
return "index"

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


举报

相关推荐

0 条评论