1、add_url_rule
这个方法用来添加url与视图函数的映射。如果没有填写`endpoint`,那么默认会使用`view_func`的名字作为`endpoint`。以后在使用`url_for`的时候,就要看在映射的时候有没有传递`endpoint`参数,如果传递了,那么就应该使用`endpoint`指定的字符串,如果没有传递,那么就应该使用`view_func`的名字。
def my_list():
return '我是列表页'
app.add_url_rule('/list/',endpoint='test',view_func=my_list)
#endpoint 给url取个名字
@app.route('/',endpoint='index')
def hello_world():
print(url_for('test')) #应使用endpoint的值,没有endpoint再使用view_func
return 'Hello World!'
2、类视图
和Django对比,这相当于Django中的CBV。
标准视图:
- 必须继承自 flask.views.View。
- 必须实现dispatch_request方法,以后请求过来后,都会执行这个方法,返回值相当于视图函数一样,必须返回'Response'或者子类的对象,或者是字符串,或者是元祖
- 必须通过app.add_url_role(url_rule,view_func)来做url与视图的映射
class Test(views.View):
def __init__(self):
self.context = {
'name': 'tian',
'age': 18,
'hobby': '抽烟,喝酒,烫头'
}
def dispatch_request(self):
return render_template('test.html', **self.context)
app.add_url_rule('/test/', view_func=Test.as_view('test'))
test.html
<h1>{{ name }}</h1>
<h1>{{ age }}</h1>
<h1>{{ hobby }}</h1>
基于调度方法的类视图:
根据请求的`method`来执行不同的方法的。如果用户是发送的`get`请求,那么将会执行这个类的`get`方法。如果用户发送的是`post`请求,那么将会执行这个类的`post`方法。
class LoginView(views.MethodView):
def __render(self, error=None):
return render_template('login.html', error=error) # 传递错误信息error
def get(self):
return self.__render()
def post(self):
username = request.form.get('username') # request.form
password = request.form.get('password')
if username == 'dage' and password == '666666':
return '登录成功'
else:
return self.__render(error='用户名或密码错误')
app.add_url_rule('/login/', view_func=LoginView.as_view('login'))
3、蓝图
结构更加清晰,将相同模块的视图函数放在同一个蓝图下,同一个文件中,方便管理。
将大项目分开,像Django的多app。
以用户模块为例:
from flask import Blueprint
user_bp = Blueprint('user',__name__,url_prefix='/user') #名字,__name__,url_prefix给路径前面加个user前缀
@user_bp.route('/profile/')
def profile():
return '个人中心页面'
然后在主app文件中注册:
app.register_blueprint(user_bp)
①模板文件的寻找
优先去项目下的template文件下寻找,如果找不到,则到定义蓝图时给出的路径去寻找
news_bp = Blueprint('user', __name__, url_prefix='/news',
template_folder='user_template')
②静态文件的查找
- 在模版文件中,加载静态文件,如果使用url_for('static'),那么就只会在app指定的静态文件夹目录下查找静态文件。
- 如果在加载静态文件的时候,指定的蓝图的名字,比如`news.static`,那么就会到这个蓝图指定的static_folder下查找静态文件。
4、url_for反转蓝图
在使用url_for找蓝图中函数的url时,应指定蓝图。同样在模板中使用时也应该指定蓝图的名字。
url_for('user.list')
5、蓝图实现子域名
蓝图可以配置自己的域名:
app.config['SERVER_NAME'] = 'baidu.com:5000'
①需要修改hosts文件,添加如下:
127.0.0.1 baidu.com
②设置子域名,关键参数:subdomain
cms_bp = Blueprint('cms', __name__, subdomain='wenku')
注意:IP地址不能有子域名。
localhost也不能有子域名。