add_url_rule
和approute
原理解析add_url_rule(rule,endpoint=None,view_func=None)
这个方法用来添加url与视图函数的映射。如果没有填写endpoint
,那么默认会使用view_func
的名字作为endpoint
。以后在使用url_for
的时候,endpoint可以不写,如果不写,则默认使用视图函数的名字。
def my_list():
return 'list'
app.add_url_rule('/list/', endpoint='xxx', view_func=my_list)
此处的endpoint用于url_for()
,当添加自定义规则后,必须使用endpoint定义的名称才可以访问。
@app.route('/', endpoint='index')
def index():
return redirect(url_for('xxx'))
否则报错:werkzeug.routing.BuildError
app.route(rule,**options)
装饰器:这个装饰器底层,其实也是使用add_url_rule
来实现url与视图函数映射的。
flask.views.View
.dipatch_request
方法,以后请求过来后,都会执行这个方法。这个方法的返回值就相当于是之前的函数视图一样。也必须返回Response
或者子类的对象,或者是字符串,或者是元组。app.add_url_rule(rule,endpoint,view_func)
来做url与视图的映射。view_func
这个参数,需要使用类视图下的as_view
类方法类转换:ListView.as_view('list')
。endpoint
,那么在使用url_for
反转的时候就必须使用endpoint
指定的那个值。如果没有指定endpoint
,那么就可以使用as_view(视图名字)
中指定的视图名字来作为反转。class ListView(View):
def dispatch_request(self):
return 'list view'
# ListView.as_view('list') 把类转为函数,并添加函数名
app.add_url_rule('/list/', endpoint='list', view_func=ListView.as_view('list'))
@app.route('/')
def index():
return redirect(url_for('list'))
method
来执行不同的方法的。如果用户是发送的get
请求,那么将会执行这个类的get
方法。如果用户发送的是post
请求,那么将会执行这个类的post
方法。其他的method类似,比如delete
、put
。get
请求相关的代码都放在get
方法中,所有和post
请求相关的代码都放在post
方法中。就不需要跟之前的函数一样,通过request.method == 'GET'
。class LoginView(MethodView):
def get(self):
return render_template('login.html')
def post(self):
username = request.form.get('username')
pwd = request.form.get('pwd')
return "%s, %s" % (username, pwd)
app.add_url_rule('/login/', view_func=LoginView.as_view('login'))
app.route
下面。否则这个装饰器就起不到任何作用。decorators
,这个类属性是一个列表或者元组都可以,里面装的就是所有的装饰器。class ListView(View):
decorators = [xxx, xxx]
def dispatch_request(self):
return 'list view'
app.add_url_rule('/list/', view_func=ListView.as_view('list'))
蓝图的作用就是让我们的Flask项目更加模块化,结构更加清晰。可以将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。
在蓝图文件中导入Blueprint:
from flask import Blueprint
user_bp = Blueprint('user', __name__, url_prefix='/user')
url_predix
后面不要加/
如果加了,之后的视图路由名称之前不要加/
在主app文件中注册蓝图:
from blueprints.user import user_bp
app.regist_blueprint(user_bp)
如果想要某个蓝图下的所有url都有一个url前缀,那么可以在定义蓝图的时候,指定url_prefix参数:
user_bp = Blueprint('user',name,url_prefix='/user/')
在定义url_prefix的时候,要注意后面的斜杠,如果给了,那么以后在定义url与视图函数的时候,就不要再在url前面加斜杠了。
之后访问域名: 127.0.0.1:5000/user/xxx
news.static
,那么就会到这个蓝图指定的static_folder下查找静态文件。
news.news_list
。否则就找不到这个endpoint。在模版中的url_for同样也是要满足这个条件,就是指定蓝图的名字。
即使在同一个蓝图中反转视图函数,也要指定蓝图的名字。
subdomain
参数,来指定这个子域名的前缀。例如:cms_bp = Blueprint('cms',__name__,subdomain='cms')
。app.config['SERVER_NAME'] = 'test.com:5000'
C:\Windows\System32\drivers\etc
下,找到hosts文件,然后添加域名与本机的映射。例如:
127.0.0.1 test.com
127.0.0.1 test.jd.com
域名和子域名都需要做映射。