全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

一个基于flask的web应用诞生 组织结构调整(7)

现在所有的Py代码均写在default.py文件中,很明显这种方法下,一旦程序变的负责,那么无论对于开发和维护来说,都会带来很多问题。

Flask框架并不强制要求项目使用特定的组织结构,所以这里使用的组织结构并不一定与其它项目中相同。

根据default.py中的代码,大体可分为三类:表单模型,数据模型,视图方法,所以模型也网这类中来区分。所以按照其他语言(java)得来的经验,每个类为一个py文件,放到相应的文件夹中

在单个文件中,所有的配置都写在单个的文件里,而在进行多文件重构之后,还这样做很明显是不合适的,所以创建一个独立的config文件很有必要:

class Config:
 SECRET_KEY="Niu_blog String"
 SQLALCHEMY_DATABASE_URI='mysql://root:1234@localhost/cblog'
 SQLALCHEMY_COMMIT_ON_TEARDOWN=True
 LOGIN_PROTECTION="strong"
 LOGIN_VIEW="login"

然后是初始化文件(app/__init__.py):

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
import pymysql
pymysql.install_as_MySQLdb()
from config import Config

bootstrap = Bootstrap()
db = SQLAlchemy()
login_manager=LoginManager();

def create_app():
 app = Flask(__name__)
 app.config.from_object(Config)
 bootstrap.init_app(app)
 login_manager.init_app(app)
 login_manager.session_protection=Config.LOGIN_PROTECTION
 login_manager.login_view=Config.LOGIN_VIEW
 db.init_app(app)
 return app

进一步模块化还要使用蓝本,蓝本的功能有些类似 asp.net mvc中的area,将不同模块的视图方法整合到一起,并通过url进行区分,首先入口即index页面定义为main蓝本,方法如下:

  • 创建main文件夹
  • 文件夹内新建蓝本初始化文件__init__.py
  • 创建视图方法文件view.py
  • 主蓝本内创建错误页视图方法errors.py

初始化文件代码如下:

from flask import Blueprint

main=Blueprint("main",__name__) # 创建蓝本
from . import errors,views

目前,视图方法文件只有一个index方法,代码如下:

from flask import render_template
from . import main

@main.route("/")
def index():
 return render_template("index.html",site_name='myblog')

错误页代码略

主蓝本的的URL不使用前缀

然后登陆注册登出页集中到权限蓝本(auth),权限蓝本初始化代码如下:

from flask import Blueprint

auth=Blueprint("auth",__name__)
from . import views

 视图主要为之前已经完成的视图迁移过来:

from . import auth
from .. import db,login_manager
from ..forms.LoginForm import LoginForm(*)
from ..models.User import User (*)
from flask_login import login_user,logout_user
from flask import render_template,flash,redirect,url_for

@auth.route("/login",methods=["GET","POST"])
def login():
 form = LoginForm()
 print(url_for("main.index"))
 if form.validate_on_submit():
  username = form.username.data
  password = form.password.data
  print(User)
  user = User.query.filter_by(username=username, password=password).first()
  if user is not None:
   login_user(user, form.remember_me.data)
   print(url_for("main.index"))
   return redirect(url_for("main.index"))
  else:
   flash("您输入的用户名或密码错误")
   return render_template("/auth/login.html", form=form) # 返回的仍为登录页
  return redirect(url_for("main.index"))
 return render_template("/auth/login.html",form=form)

@auth.route("/logout",methods=["GET","POST"])
def logout():
 logout_user()
 return redirect(url_for("main.index"))

@login_manager.user_loader
def load_user(user_id):
 return User.query.get(int(user_id))

注意打星号标记的两行,一定要注意py文件和py对象,必须在文件内在import对象

其中LoginForm文件内的代码如下:

from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField,BooleanField
from wtforms.validators import DataRequired

class LoginForm(FlaskForm):
 username=StringField("请输入用户名",validators=[DataRequired()])
 password=PasswordField("请输入密码")
 remember_me=BooleanField("记住我")
 submit=SubmitField("登录")

User文件内的代码如下:

from flask_login import UserMixin
from .. import db

class User(UserMixin,db.Model):
 __tablename__="users"
 id=db.Column(db.Integer,primary_key=True)
 username=db.Column(db.String(50),unique=True,index=True)
 password=db.Column(db.String(50))
 nickname=db.Column(db.String(50))
 email=db.Column(db.String(100))
 birthday=db.Column(db.DateTime)
 gender=db.Column(db.Integer)
 remark=db.Column(db.String(200))
 role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))

注意一下flask插件的导入方式都由flask.ext.*改为新版本推荐的flask_*这种方式,在此感谢博友 治电小白菜的提醒。

当然,最终还要对蓝本进行注册,所以最终create_app方法的代码为:

def create_app():
 app = Flask(__name__)
 app.config.from_object(Config)
 bootstrap.init_app(app)
 login_manager.init_app(app)
 login_manager.session_protection=Config.LOGIN_PROTECTION
 login_manager.login_view=Config.LOGIN_VIEW
 db.init_app(app)
 from .main import main as main_blueprint
 from .auth import auth as auth_blueprint
 app.register_blueprint(main_blueprint)     #无url前缀
 app.register_blueprint(auth_blueprint,url_prefix="/auth") #url前缀为/auth
 return app

最后修改的是启动运行的方式,新建一个manager.py文件,配置启动代码如下:

from app import create_app, db
from flask_script import Manager,Shell
from flask_migrate import Migrate,MigrateCommand
from app.models.User import User
from app.models.Role import Role
import pymysql
pymysql.install_as_MySQLdb()
app=create_app()
manager=Manager(app);
migrate = Migrate(app, db)


def make_shell_context():
 return dict(app=app,db=db,User=User,Role=Role) #注册shell命令
manager.add_command("db", MigrateCommand) #新增db命令用于数据库迁移
manager.add_command("shell" ,Shell(make_context=make_shell_context()))

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

用最土的方式,跑跑运行一下,运行结果与之前仅有default.py的时候相同,此时系统目录如下,仅供参考:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# flask  # 结构调整  # 跟老齐学Python之网站的结构  # Python复制目录结构脚本代码分享  # 在Python中移动目录结构的方法  # 请输入  # 很明显  # 写在  # 组织结构  # 的是  # 在此  # 很有  # 而在  # 这类  # 这样做  # 只有一个  # 要对  # 表单  # 得来  # 可分为  # 中来  # 新版本  # 创建一个  # 三类  # 不合适 


相关文章: 在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何高效配置香港服务器实现快速建站?  如何高效搭建专业期货交易平台网站?  建站之星导航配置指南:自助建站与SEO优化全解析  建站主机选购指南:核心配置与性价比推荐解析  制作网页的网站有哪些,电脑上怎么做网页?  如何通过西部建站助手安装IIS服务器?  太平洋网站制作公司,网络用语太平洋是什么意思?  高端建站如何打造兼具美学与转化的品牌官网?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何在服务器上三步完成建站并提升流量?  如何在万网自助建站平台快速创建网站?  制作表格网站有哪些,线上表格怎么弄?  如何挑选最适合建站的高性能VPS主机?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  建站之星收费标准详解:套餐费用及年费价格表一览  模具网站制作流程,如何找模具客户?  如何破解联通资金短缺导致的基站建设难题?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  内网网站制作软件,内网的网站如何发布到外网?  如何通过多用户协作模板快速搭建高效企业网站?  如何在云主机快速搭建网站站点?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何彻底删除建站之星生成的Banner?  移民网站制作流程,怎么看加拿大移民官网?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  网站制作企业,网站的banner和导航栏是指什么?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  已有域名和空间,如何快速搭建网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  详解jQuery中基本的动画方法  阿里云网站制作公司,阿里云快速搭建网站好用吗?  建站之星如何通过成品分离优化网站效率?  网站制作需要会哪些技术,建立一个网站要花费多少?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何撰写建站申请书?关键要点有哪些?  如何在腾讯云免费申请建站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何选择服务器才能高效搭建专属网站?  如何选择网络建站服务器?高效建站必看指南  如何在橙子建站中快速调整背景颜色?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。