1.0 类试图的使用
1. 什么是类视图
视图也可以基于类的方式来实现,他的**优点**在于可以继承。
类视图和视图函数不一样,它需要继承“Views.Vive”类,并使用app.add_url_rule('/profile/',view_func=CeShi.as_view('file'))的方式进行注册
2. 类视图的使用
需要在子类中重写 “dispatch_request`”方法,需要返回一个Response或者其他子类的对象。
3. flask还为我们准备了另一种视图,基于调度方法的视图
“views.MethodView”,根据每个http不同方法,执行不同的函数
class ViewIndex(views.MethodView):
def get(self):
return render_template('index.html')
def post(self):
name = request.form.get('name')
password = request.form.get('password')
if name == 'cheney' and password == '123':
return '登录成功'
else:
return '登录失败'
4. 类视图的缺陷
不好用装饰器去装饰,当我们写完一个装饰器后,可以在类视图中定义一个属性“decorators”然后储存装饰器,以后每次调用这个类视图的时候都会调用装饰器。
class View_List(views.View):
decorators = [hello]
def dispatch_request(self):
return '个人中心'
2.0 蓝图
2.1. 蓝图的作用:
当我们开发大项目时,我们的视图函数和URL还在童一个文件中,显然就不合适,这时候我们就需要蓝图,实现项目模块化。
#导入蓝图
form flask import Blueprint
#实例化蓝图
book_bp = Blueprint('name',__name__)
@book_bp.route('/book/')
def book():
return '这是图书馆首页'
2.2. 蓝图的使用
当创建蓝图后,使用时需要在主程序中去将蓝图注册,映射道URL中
app.register_blueprint(book_bp) #在主程序中注册
2.3. 蓝图注意事项
- 寻找静态文件
在默认状态下,Jinja2模板会在项目static静态文件下寻找,也可以设定,在Blueprint这个构造函数中,有一个参数static_folder中设定静态文件的路径。在模板中引用蓝图时需要,“蓝图名+.+static进行引用”
<link rel="stylesheet" href="{{ url_for('admin.static',filename='book.css') }}">
-
寻找模板文件
在默认状态下,Jinja2模板会在项目templates文件下寻找模板文件,在构造函数Blueprint中有个参数“template_folder=“templates”,可以进行更改,但是不建议更改。模板文件和静态文件渲染是有区别的,模板文件渲染时,flask会优先从根目录下的templates文件下查找文件,如果找不到就会在去蓝图文件下templates文件中查找。 -
url_for 生成url
使用urlz-for生成蓝图url时,其使用格式为“蓝图名称+.+视图函数名称”
#以蓝图admin为例子
url_for(admin.index)
蓝图名是在创建蓝图是第一个传入的参数
news_bp = Blueprint('news',__name__,url_prefix=‘/index/’)
3.0 子域名
子域名在许多网站都有使用,如网址xxx.com,可以定义一个子域名,xms.xxx.com,为某个域名的管理系统的网址,子域名也是根据蓝图来进行实现的,之前创建蓝图时参数url_prefix=‘/index/,我们通过/index/来访问url,但是子域名不需要,它需要配置SERVER_NAME.
#如下:需要写进配置文件中
app.config[SERVER_NAME]=XMS.XXX.COM:9000
并且在注册蓝图时,还需要添加一个参数subdomain,这个参数就是子域名的名称
news_bp = Blueprint(‘news’,name,url_prefix=‘/index/’,subdomain=‘xms’)
下面看个实例:
#news蓝图模块
from flask import Blueprint
news_bp = Blueprint('news',__name__,url_prefix=‘/index/,subdomain=‘xms’)
@news_bp.route('/news/')
def news():
return '这是新闻首页'
from flask import Flask
import news #news为蓝图已创建的模块
app = Flask(__name__)
app.config[SERVER_NAME] = 'taobao.com:8888' #设置子域名
#在主文件注册蓝图,蓝图中已设置subdomain
app.register_blueprint(news_bp) #
#写完上门两个小程序后,我们还是不能执行子域名xms.taobao.com:8888 成功,还需要更改本机的host文件中添加域名解析,在host文件下写入
127.0.0.1 xms.taobao.com
添加完后就可以访问了,但这个时候,我们在通过以前的127.0.0.1:8888/访问url,是不行的,也不能通过localhost访问。
if __name__ == '__main__':
app.run(debug=True)