Flask框架(之六)蓝图和子域名

Flask框架蓝图和子域名

一、基于调度方法的视图

  • Flask还为我们提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。
class xxxx(views.MethodView): 
	def get(self): 
		pass
 	def post(self):
 	 	pass

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 用类视图的一个缺陷就是比较难用装饰器来装饰
from flask import session
def login_required(func):
    def wrapper(*args,**kwargs):
        if not session.get("user_id"):
            return 'auth failure'
        return func(*args,**kwargs)
    return wrapper

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 装饰器写完后,可以在类视图中定义一个属性叫做decorators,然后存储装饰器。以后每次调用这个类视图的时候,就会执行这个装饰器
class UserView(views.MethodView):
    decorators = [user_required]

二、蓝图

2.1蓝图

  • 之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求,通过app.register_blueprint()方法将这个蓝图注册进url映射中,以后访问/user/,/user/profile/,都是执行的user.py文件中的视图函数,这样就实现了项目的模块化。
from flask import Blueprint
bp = Blueprint('user',__name__,url_prefix='/user/')
@bp.route('/')
def index():
    return "用户首页"
@bp.route('profile/')
def profile():
    return "个人简介"
 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2寻找静态文件

  • 默认不设置任何静态文件路径,Jinja2会在项目的static文件夹中寻找静态文件。也可以设置其他的路径,在初始化蓝图的时候,Blueprint这个构造函数,有一个参数static_folder可以指定静态文件的路径,static_folder可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在配置完蓝图后,还有一个需要注意的地方是如何在模板中引用静态文件。在模板中引用蓝图,应该要使用蓝图名+.+static来引用。
bp = Blueprint('admin',__name__,url_prefix='/admin',static_folder='static')
<link href="{{ url_for('admin.static',filename='about.css') }}">

2.3寻找模板文件

  • 跟静态文件一样,默认不设置任何模板文件的路径,将会在项目的templates中寻找模板文件。也可以设置其他的路径,在构造函数Blueprint中有一个template_folder参数可以设置模板的路径
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
  • 模板文件和静态文件有点区别,以上代码写完以后,如果你渲染一个模板return render_template(‘admin.html’),Flask默认会去项目根目录下的templates文件夹中查找admin.html文件,如果找到了就直接返回,如果没有找到,才会去蓝图文件所在的目录下的templates文件夹中寻找。
    在这里插入图片描述
    在这里插入图片描述

2.4url_for生成url

  • 用url_for生成蓝图的url,使用的格式是:蓝图名称+.+视图函数名称
url_for('admin.index')
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')

在这里插入图片描述

在这里插入图片描述

三、子域名

  • 子域名在许多网站中都用到了,比如一个网站叫做xxx.com,那么我们可以定义一个子域名cms.xxx.com来作为cms管理系统的网址,子域名的实现一般也是通过蓝图来实现,在之前章节中,我们创建蓝图的时候添加了一个url_prefix=/user作为url前缀,那样我们就可以通过/user/来访问user下的url。但使用子域名则不需要。另外,还需要配置SERVER_NAME。
from flask import Flask
import admin
# 配置`SERVER_NAME`
app.config['SERVER_NAME'] = 'example.com:8000'
# 注册蓝图,指定了subdomain
app.register_blueprint(admin.bp)
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8000,debug=True)
  • 子域名不能在127.0.0.1上出现,也不能在localhost上出现。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页