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


Posted in Python onApril 11, 2017

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

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

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

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

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

在单个文件中,所有的配置都写在单个的文件里,而在进行多文件重构之后,还这样做很明显是不合适的,所以创建一个独立的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的web应用诞生 组织结构调整(7)

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

Python 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python计算字符宽度的方法
Jun 14 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Python二进制文件读取并转换为浮点数详解
Jun 25 Python
Python3分析处理声音数据的例子
Aug 27 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
Django values()和value_list()的使用
Mar 31 Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 Python
python Selenium 库的使用技巧
Oct 16 Python
详解python中的异常和文件读写
Jan 03 Python
Django项目如何正确配置日志(logging)
Apr 29 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
Apr 11 #Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 #Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 #Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 #Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 #Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 #Python
一个基于flask的web应用诞生(1)
Apr 11 #Python
You might like
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
jquery代码实现简单的随机图片瀑布流效果
2015/04/20 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python机器学习之神经网络(一)
2017/12/20 Python
python 获取url中的参数列表实例
2018/12/18 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
python实现人工蜂群算法
2020/09/18 Python
Hammitt官网:设计师手袋
2020/05/23 全球购物
关于护士节的演讲稿
2014/05/26 职场文书
公司副总经理任命书
2014/06/05 职场文书
行政申诉状范文
2015/05/20 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
MySQL主从搭建(多主一从)的实现思路与步骤
2021/05/13 MySQL
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
Js类的构建与继承案例详解
2021/09/15 Javascript
36个正则表达式(开发效率提高80%)
2021/11/17 Javascript