Flask框之类视图、蓝图和子域名

一、类视图
之前我们接触的视图都是函数,所以一般简称视图函数。其实视图也可以基于类来实现,类视图的好处是支持继承,但是类视图不能跟函数视图一样,写完类视图还需要通过app.add_url_rule(url_rule,view_func)来进行注册
1.1 标准类视图
标准类视图是继承自flask.views.View,并且在子类中必须实现dispatch_request方法,这个方法类似于视图函数,也要返回一个基于Response或者其子类的对象,如下例子继承类

#py代码
from flask import Flask,render_template
from flask.views import View
app=Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
class Base_view(View):
      def __init__(self):
          self.context={'username':'dahong'}
class Loginview(Base_view):
    def dispatch_request(self):
        return render_template('login.html',**self.context)
class Registview(Base_view):
    def dispatch_request(self):
        return render_template('register.html',**self.context)
app.add_url_rule('/login/',view_func=Loginview.as_view('login'))
app.add_url_rule('/regist/',view_func=Registview.as_view('regist'))
if __name__ == '__main__':
    app.run(debug=True)

login.html、Register.html和index.html代码分别如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 基于调度方法的视图
固定写法如下:

class xxxx(views.MethodView):
     def get(self):
pass
   def post(self):
pass

在这里插入图片描述
二、蓝图
之前我们写的url和视图函数都是处在同一文件,如项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮忙我们实现这种需求,一个功能一个蓝图,类似于模块

from flask import Blueprint
#url_prefix是url的前缀,后续用于url的可以省略
bp = Blueprint('user',__name__,url_prefix='/user/')
@bp.route('/')
def index():
    return "用户首页"
@bp.route('profile/')
def profile():
    return "个人简介"

然后在主程序中,先导入,再注册就可以使用,如下图

from flask import Flask
import user #user即你建蓝图的html文件名
app = Flask(__name__)
app.register_blueprint(user.bp)
if __name__ == '__main__':
    app.run(debue=True)

1.1 寻找静态文件
默认不设置作任何静态路径,jinja2会在项目的static文件夹中寻找静态文件,也可以设置其他路径,在初始化蓝图的时候,Blueprint这个构造函数,有一个参数static_folder可以指定静态文件路径,但建议保留默认,不然后续寻找路径时造成麻烦
bp = Blueprint(‘admin’,name,url_prefix=’/admin’,static_folder=‘static’)
在模板中引用蓝图,应该要使用"蓝图名+.+static"来引用

1.2 寻找模板文件 默认为先在Flask的项目根目录查找,如没有找到才会去蓝图文件所在的目录下templates文件夹中寻找,用法与Flask中的一样 1.3 url_for生成url 用url_for生成蓝图的url,使用的格式是:蓝图名称+.+视图函数名称。如获取admin这个蓝图下的index视图函数的url url_for('admin.index') 三、子域名 子域名在许多网站中都用到,如一个网站叫会xxx.com,那么我们可以定义一个子域名cms.xxx.com 来作为cms管理系统的网址,子域名的实现一般也是通过蓝图来实现, 需配置SERVER_NAME 如app.config[SERVER_NAME]='example.com:8000' 并且在注册蓝图的时候,还需添加一个subdomain的参数,这个参数就是子域名的名称
from flask import Blueprint
bp = Blueprint('admin',__name__,subdomain='admin')
@bp.route('/')
def admin():
    return 'Admin Page'

接下来看主app的实现

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='127.0.0.1',port=8000,debug=True)

写完以上两个文件后,还是不能正常访问admini.example.com:8000这个子域名,
因为我们没有在host文件中添加域名解析,你可以在最后添加一行127.0.0.1 admin.example.com
就可以访问到了,另子域名不能在127.0.0.1上出现,也不能在localhost上出现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值