Flask——类视图,蓝图使用

1.类视图

视图函数:通过函数传递,实现的视图跳转

@app.route('/')
def index():
	return xxx
  • 视图不仅可以通过函数来实现,也可以通过类实现,其可以继承类的多种方法,大量节俭代码。
  • **注意:类试图需要通过app.add_url_rule(’/xxx/’,view_func)**来进行注册
from flask import  Flask,url_for,views,jsonify

app = Flask(__name__)

@app.route('/')
def index():
    print(url_for('geren'))
    return 'index'

#@app.route('/profile/')
def profile():
    return '个人中心'


app.add_url_rule('/profile/', endpoint='geren', view_func=profile)
#endpoint相当于给函数取了另外一个名字。这个方法功能类似于@app.route
  • 标准类视图:继承自flask.views.View,并且在子类中必须实现dispatch_request方法,该方法类似于视图函数,也要返回一个基于Response或者其子类的对象
from flask.views import View
class PersonalView(View):
    def dispatch_request(self):
        return "view类视图"
    
# 类视图通过add_url_rule方法和url做映射
app.add_url_rule('/users/',view_func=PersonalView.as_view('personalview'))
  • 基于调度方法的视图
    flask提供的另一种方法视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)
class LoginView(views.MethodView):
    # 当客户端通过get方法进行访问的时候执行的函数
    def get(self):
        return render_template("login.html")

    # 当客户端通过post方法进行访问的时候执行的函数
    def post(self):
        email = request.form.get("email")
        password = request.form.get("password")
        if email == 'xx@qq.com' and password == '111111':
            return "登录成功!"
        else:
            return "用户名或密码错误!"

# 通过add_url_rule添加类视图和url的映射,并且在as_view方法中指定该url的名称,方便url_for函数调用

app.add_url_rule('/myuser/',view_func=LoginView.as_view('loginview'))

**注意:**类视图的一个缺陷就是比较难用装饰器来进行装饰

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

装饰器写完后,在类视图中可以定义一个变量保存装饰器,在调用这个类似图的时候直接执行。

class ProfileView(views.View):
    decorators = [login_reequired]#类视图的装饰器使用
    def dispatch_request(self):
        return '个人中心'

2.蓝图和子域名

  • 蓝图是一种合理的项目结构,在处理url以及大量代码在同一个文件中的时候,方便整合。
from flask import Blueprint, render_template

book_bp = Blueprint('book', __name__, url_prefix='/book/')


@book_bp.route('/')
def book():
    return render_template('book.html')


@book_bp.route('/detail/<id>')
def book_detail(id):
    # return '图书第{}页'.format(id)
    return '图书第%s页' % id

在主程序中可以通过**app.register_blueprint()**将这个蓝图注册进url映射中。

from flask import Flask, url_for
from blueprints.book import book_bp

app = Flask(__name__)
app.register_blueprint(book_bp)

@app.route('/')
def index():
    print(url_for('book.book_detail', id=6))
    return '这是首页'


if __name__ == '__main__':
    app.run(debug=True)

上诉就是蓝图的简单使用。

1.寻找静态文件

  • 默认不设置任何静态文件路径,Jinja2会在项目的static文件夹中寻找静态文件。也可以自己设定其他的路径,查看Blueprint源代码时,可以通过static_folder指定静态文件的路径
bp = Blueprint('admin',__name__,url_prefix='/admin',static_folder='static')

static_folder可以是相对路径(相对蓝图文件所在的目录),也可以是绝对路径。在模板中引用静态文件,应该使用蓝图名.static进行引用

<link href="{{ url_for('admin.static',filename='about.css') }}">

2.寻找模板文件

  • 默认不设置任何模板文件的路径,自动在templates文件夹中寻找模板文件。也可以通过template_folder参数设置模板的路径
bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')

注意:在渲染模板文件时,flask会先从默认的templates文件夹中寻找模板,找到了就返回,没找到才会去蓝图文件所在的目录下的templates文件夹中寻找。render_template('admin.html')

3.url_for生成url:

  • 用url_for生成蓝图的url,使用蓝图名称.视图函数名称,例如获取admin蓝图下index视图函数的url
url_for('admin.index')

蓝图名称为创建蓝图时候传入的第一个参数,

bp = Blueprint('admin',__name__,url_prefix='/admin',template_folder='templates')
#url_prefix为路由的前缀。

4.子域名

  • 定义一个域名cms.xxx.com作为cms管理系统的网址,子域名的实现也是通过蓝图实现,添加url_prefix=/user作为前缀,那么就可以通过/user/来访问user下的url。使用子域名的时候,需要配置SERVER_NAME.**app.config[SERVER_NAME]=‘example.com:9000’**在注册蓝图的时候,添加一个subdomain的参数作为子域名的名称
from flask import Blueprint
bp = Blueprint('admin',__name__,subdomain='admin')
@bp.route('/')
def admin():
    return 'Admin Page'

在主程序中实现定义子域名

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)

注意:需要在windows/system32/driver/etc/host文件中添加域名解析127.0.0.1 admin.example.com就可以访问该域名。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值