一个基于flask的web应用诞生第七篇,这篇文章主要介绍了组织结构的调整,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
现在所有的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的时候相同,此时系统目录如下,仅供参考:
以上就是 组织结构调整的实例详解(python)的详细内容。