现在所有的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蓝本,方法如下:
初始化文件代码如下:
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中移动目录结构的方法
# 请输入
# 很明显
# 写在
# 组织结构
# 的是
# 在此
# 很有
# 而在
# 这类
# 这样做
# 只有一个
# 要对
# 表单
# 得来
# 可分为
# 中来
# 新版本
# 创建一个
# 三类
# 不合适
相关文章:
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何访问已购建站主机并解决登录问题?
如何撰写建站申请书?关键要点有哪些?
建站之星免费模板:自助建站系统与智能响应式一键生成
Android滚轮选择时间控件使用详解
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
建站之星×万网:智能建站系统+自助建站平台一键生成
*服务器网站为何频现安全漏洞?
如何用景安虚拟主机手机版绑定域名建站?
如何选择高性价比服务器搭建个人网站?
如何选择PHP开源工具快速搭建网站?
用v-html解决Vue.js渲染中html标签不被解析的问题
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站之星安装后界面空白如何解决?
简单实现Android验证码
如何做静态网页,sublimetext3.0制作静态网页?
实例解析angularjs的filter过滤器
成都网站制作报价公司,成都工业用气开户费用?
建站之星CMS五站合一模板配置与SEO优化指南
如何在宝塔面板中创建新站点?
深入理解Android中的xmlns:tools属性
北京专业网站制作设计师招聘,北京白云观官方网站?
Thinkphp 中 distinct 的用法解析
建站之星后台密码遗忘或太弱?如何重置与强化?
如何在西部数码注册域名并快速搭建网站?
智能起名网站制作软件有哪些,制作logo的软件?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
5种Android数据存储方式汇总
如何通过虚拟主机快速搭建个人网站?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
大连 网站制作,大连天途有线官网?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
南京网站制作费用,南京远驱官方网站?
免费视频制作网站,更新又快又好的免费电影网站?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
南宁网站建设制作定制,南宁网站建设可以定制吗?
高防服务器如何保障网站安全无虞?
简历在线制作网站免费版,如何创建个人简历?
如何注册花生壳免费域名并搭建个人网站?
如何挑选优质建站一级代理提升网站排名?
设计网站制作公司有哪些,制作网页教程?
建站三合一如何选?哪家性价比更高?
南平网站制作公司,2025年南平市事业单位报名时间?
建站之星在线版空间:自助建站+智能模板一键生成方案
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
*请认真填写需求信息,我们会在24小时内与您取得联系。