Python_Flask flask蓝图概念、蓝图与视图的关系

本文介绍了如何使用Flask框架构建一个简单的应用,包括模块划分(app.py、__init__.py、users模块),蓝图的设置(user_bp)和模板结构(base.html和register.html)。核心内容涉及用户视图处理(register、login、logout)和模型定义(User类)。
摘要由CSDN通过智能技术生成

前言

启动文件

#app.py
from flask import Flask
from apps import create_app

app = create_app()

if __name__ == '__main__':
    app.run(

把APP拿出来

# -*- codeing = utf-8 -*-
# @Time : 2021/8/25 16:05
# @Author : 二帆
# @File : __init__.py.py
# @Software : PyCharm
from flask import Flask

import settings


def create_app():
    app =Flask(__name__)    #app是一个核心对象
    app.config.from_object(settings)        #加载配置

    return app

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

蓝图

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

之间的搭建关系1

在这里插入图片描述

在这里插入图片描述

之间的搭建关系2

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

代码

app.py

from flask import Flask
from apps import create_app

app = create_app()

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

apps----->init.py

在这里插入图片描述

# -*- codeing = utf-8 -*-
# @Time : 2021/8/25 16:05
# @Author : 二帆
# @File : __init__.py.py
# @Software : PyCharm
from flask import Flask

import settings
from apps.users.view import user_bp


def create_app():
    app =Flask(__name__,template_folder='../templates',static_folder='../static')    #app是一个核心对象
    app.config.from_object(settings)        #加载配置
    #蓝图

    app.register_blueprint(user_bp)
    print(app.url_map)

    return app

apps----->users----->view.py

在这里插入图片描述

# -*- codeing = utf-8 -*-
# @Time : 2021/8/25 16:24
# @Author : 二帆
# @File : view.py
# @Software : PyCharm
from flask import Blueprint, request, render_template

user_bp = Blueprint('user',__name__)

#列表保存的是一个一个的用户对象
users = []

@user_bp.route('/')
def user_center():
    if request.method == 'POST':
        pass
    return render_template('users/register.html')

@user_bp.route('/register',methods =['GET','POST'])
def register():
    return '用户注册'

@user_bp.route('/login',methods =['GET','POST'])
def login():
    return '用户登录'

@user_bp.route('/logout',methods =['GET','POST'])
def logout():
    return '用户退出'

apps----->users----->model.py

在这里插入图片描述

# -*- codeing = utf-8 -*-
# @Time : 2021/8/25 16:54
# @Author : 二帆
# @File : model.py
# @Software : PyCharm
class User:
    def __init__(self,username,password,phone=None):
        self.username = username
        self.password = password
        self.phone = phone

    def __str__(self):
        return self.username

templates----->base.html

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title%}用户中心{% endblock %}</title>
    <style>
        #head{
            height:50px;
            background-color: bisque;
        }
        #head ul{
            list-style: none;
        }
        #head ul li{
            float: left;
            width:100px;
            text-align: center;
            font-size:18px;
            height:50px;
            line-height: 50px;
        }
        #middle{
            height: 600px;
        }
        #foot{
            height: 50px;
            line-height: 50px;
            background-color: darkcyan;
        }
    </style>
    {% block mycss %}{% endblock %}

</head>
<body>
    <div id="head">
        <ul>
            <li><a href="">首页</a></li>
            <li><a href="">秒杀</a></li>
            <li><a href="">秒杀</a></li>
            <li><a href="">会员</a></li>
            <li><a href="">图书</a></li>
        </ul>
    </div>
    <div id="middle">
        {% block middle %}
        
        {% endblock %}
    </div>
    <div id="footer"></div>
    {% block myjs %}{% endblock %}
</body>
</html>

templates------>users-------->register.html

在这里插入图片描述

{% extends 'base.html' %}
{% block title %}
    用户注册
{% endblock %}
{% block middle %}
    <form action="/register" method="post">
        <p><input type="text" name="username" placeholder="用户名"></p>
        <p><input type="password" name="password" placeholder="密码"></p>
        <p><input type="password" name="repassword" placeholder="确认密码"></p>
        <p><input type="number" name="phone" placeholder="手机号码"></p>
        <p><input type="submit" value="用户注册"></p>
    </form>
{% endblock %}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我对蓝图的理解相对通俗,就是觉得蓝图对于视图方法模块化、大项目协同开发过程中的一个很好的工具. 1.下图是我们通常情况下使用的项目组织结构 看一下视图方法: #views.py 1 from app import app 2 3 4 @app.route('/user/index') 5 def index(): 6 return 'user_index' 7 8 @app.route('/user/show') 9 def show(): 10 return 'user_show' 11 12 @app.route('/user/add') 13 def add(): 14 return 'user_add' 15 16 @app.route('/admin/index') 17 def adminindex(): 18 return 'admin_index' 19 20 @app.route('/admin/show') 21 def adminshow(): 22 return 'admin_show' 23 24 @app.route('/admin/add') 25 def adminadd(): 26 return 'admin_add' #从视图方法中,我们看到有6个视图,分别对应admin,user两个不同用户的3个功能index,add,show. 这样写显然没问题,但是明显与python提倡的模块化,优雅的代码特点相违背,即不是很pythonpython代码. 让我们在这里假想两个问题: 1.如果admin和user不止只有3个功能呢,比如好几百个,导致views的代码量已经达到了上万行? 2.如果我们有多个同事分工开发admin,user和其它可能的模块呢,都同时往一个views里写代码吗,在做版本控制时,提交过程中频繁出现提交冲突了怎么办? 3.加入我们要抛弃admin或者user功能块时怎么办,要一一手动删除所有admin或是user相关的代码吗,这样当然可以,但是会不会太low呢? 当然根据Pythonic特点,我们肯定希望尽可能的把代码尽量的模块化,让我们的代码看起来更加的优雅和顺畅,这个时候flask.Blueprint(蓝图)就派上用场了 什么是蓝图? 一个蓝图定义了可用于单个应用的视图,模板,静态文件等等的集合。 我什么时候会用到蓝图蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,user相关的视图方法分为两个组件,一个是admin组件,一个是user组件.这时我们可以 创建两个蓝图实现这两个独立的组件. 2.我们如何使用蓝本将上述的视图方法看上去更加pythonic呢? 由于上面的例子中只有两个组件(模块)admin,user,我们可以创建名为admin.py和user.py的两个文件,分别在里面创建两个蓝图的实例对象admin,user. 直接上代码: #admin.py #admin.py from flask import Blueprint,render_template, request admin = Blueprint('admin',__name__) @admin.route('/index') def index(): return render_template('admin/index.html') @admin.route('/add') def add(): return 'admin_add' @admin.route('/show') def show(): return 'admin_show' #要想创建一个蓝图对象,你需要import flask. Blueprint() 类并用参数 name 和 import_name 初始化。import_name通常用 __name__ ,一个表示当前模块的特殊的Python变量,作为 import_name 的取值。 #user.py from flask import Blueprint, render_template, redirect user = Blueprint('user',__name__) @user.route('/index') def index(): return render_template('user/index.html') @user.route('/add') def add(): return 'user_add' @user.route('/show') def show(): return 'user_show' 好了,视图函数已经分开了,我们如何使用它们的呢?再来看一下我们的views.py变成了什么样吧? #views.py from app import app from .admin import admin from .user import user #这里分别给app注册了两个蓝图admin,user #参数url_prefix='/xxx'的意思是设置request.url中的url前缀, #即当request.url是以/admin或者/user的情况下才会通过注册的蓝图视图方法处理请求并返回 app.register_blueprint(admin,url_prefix='/admin') app.register_blueprint(user, url_prefix='/user') #现在我们的views是否已经变得很简单了呢?顺便回答第三个问题,如果想弃用某一个组件(模块)我们只需要相对应的注释掉给app注册蓝图的行即可. #细心的伙伴还可以发现,在views.py中在使用默认endpoint的前提下,我们是没有办法使用同一个视图方法名的(当然我们也不建议在同一个文件中有两个视图方法名相同, #尽管指向他们的request.url不同),但是使用了蓝图之后我们就可以在不同模块中使用相同的方法名了,例如add,show.. 3.到此我们就可以通过浏览器测试我们的程序 4.附上使用蓝图后的项目组织结构 当然如果项目不大的话就没有什么必要使用蓝图了,甚至我们可以把除了所有css,js,html的代码都写到一个文件中去,这里我们不在举例,说明.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值