Flask——类视图,蓝图,子域名使用详解

本文深入探讨Flask框架中的类视图、MethodView、装饰器、蓝图注册、静态文件路由及子域名配置等高级特性,帮助开发者掌握更复杂的Web应用构建技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类视图

标准类视图 View

from flask.views import View,MethodView
# from flask import views
from flask import Flask,url_for,jsonify,render_template,request
app = Flask(__name__)

@app.route('/')
def hello():
    print(url_for('PersonaView'))
    return "函数视图"

class PersonaView(View):
    def dispatch_request(self):
        #类视图必须重写,因为父类中有这个方法,否则报出异常
        return "标准类视图"

app.add_url_rule('/users/',view_func=PersonaView.as_view('PersonaView'))
# 通过endpoint 可以给函数起名字,用来调用,使用Url_for可以得到该函数的url地址
# view_func=PersonaView 是为了指定类函数 , .as_view('') 这是给函数起名
# 虽然跟 endpoint类似,但endpoint优先级更高点.

基于调度方法的视图 MethodView

对不同的http请求方法执行不同的函数

from flask.views import MethodView
class LoginView(MethodView):
      def get(self,error=None):
          return render_template('login.html',error=error)
      def post(self):
          name=request.form.get("name")
          password=request.form.get("password")
           #查询数据库 验证...
          if name== "sang" and password=="123":
              return "登陆成功"
          else:
              return self.get("账号密码错误")
              # return render_template('login.html',error="账号密码错误")

类视图中的装饰器

#先登陆才能访问的装饰器
def login_required(func):
    def wrapper(*args,**kwargs):
        name=request.form.get('name')
        if name:
            return func(*args,**kwargs)
        else:
            return "请先登录"
    return wrapper

class ProfileView(View):
    decorators = [login_required]
    def dispatch_request(self):
        return "个人页面"
app.add_url_rule('/profile/',view_func=ProfileView.as_view('profile'))

蓝图 blueprint

在做一个项目的时候,如果把所有的文件全部放在一个文件里面会显得很繁琐,使用蓝图,会使代码更加规范。

from flask import Blueprint
book_bp=Blueprint('book',__name__,url_prefix="/book/")
#这里的url_prefix是添加url的前缀,就比如这里加了/book/ 那么 @book_bp.route('/')这里面就不用再写了

@book_bp.route('/')
def book():
    return "书籍首页"

@book_bp.route('/detail/<bid>')
def book_detail(bid):
    return "图书的id: %s " % bid

如果仅仅是这样把图书首页放在单独的文件里面,然后去主窗口运行,是进入不了 book 的,所以在上面要定义book_bp=Blueprint('book',__name__,url_prefix="/book/"),它可以标记蓝图的名字为 book_bp,然后在主窗口中注册这个蓝图对象。

from flask import Flask
from blueprint.blueprints.news import news_bp
from blueprint.blueprints.book import book_bp

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

@app.route('/')
def index():
    return "主窗口"

if __name__ =='__main__':
    app.run

这时候直接运行主窗口,就可以访问到 /news/,/book/

注册蓝图对象的静态文件相关路由

from flask import Blueprint,render_template

news_bp=Blueprint('news',__name__,template_folder='newTem',
                  static_folder='newTem')
#  在这里更改的template_folder,优先级低于默认的template_folder的位置.newTem的文件夹与蓝图文件平级
#  如果在默认位置找不到news.html,那么就会使用这里的
# 静态 static也是这样 ,找不到默认位置的文件后,再找蓝图内的newTem
@news_bp.route('/news/')
def news():
    # return "新闻首页"
    return render_template('news.html')

在这里插入图片描述

子域名

子域名(或子域;英语:Subdomain)是在域名系统等级中,属于更高一层域的域。比如,mail.example.com和calendar.example.com是example.com的两个子域,而example.com则是顶级域.com的子域。

因为flask不支持Ip形式,locahost也不支持,所以需要修改 etc/hosts
在这里插入图片描述

在falsk中,子域名也是写在蓝图里面,在子域名py文件里面

from flask import Blueprint

lin_bp=Blueprint('lin',__name__,subdomain='lin')

@lin_bp.route('/')
def lin():
    return "子域名页面"

在主界面配置

from blueprint.blueprints.lin import lin_bp
app.register_blueprint(lin_bp)
app.config['SERVER_NAME']='guguai.com:5000'

这样可以访问子域名页面了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值