一个web应用的诞生(7)

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

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

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

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

class Config:
    SECRET_KEY="Niu_blog String"
    SQLALCHEMY_DATABASE_URI=‘mysql://root:[email protected]/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蓝本,方法如下:

  1. 创建main文件夹
  2. 文件夹内新建蓝本初始化文件__init__.py
  3. 创建视图方法文件view.py
  4. 主蓝本内创建错误页视图方法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的时候相同,此时系统目录如下,仅供参考:

此章并没有多少新东西,主要是对之前的系统目录,系统结构做一些调整,这周比较忙,要准备应聘,准备面试,紧赶慢赶总算至少完成了对自己的承诺,每周一篇blog,不过如果按照发布时间来说,貌似还是晚了一天,毕竟现在已经过了0点:(

时间: 2024-08-08 05:39:11

一个web应用的诞生(7)的相关文章

一个web应用的诞生(6)

之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目的也是写出一个轻博客来,但是,在发表文章之前是不是要先记录一下登录状态呢? 用户登录 登录状态的记录方式有很多种,首先想到的应该就是使用flask自带的session,但flask还提供了一种更方便的扩展,即flask-login包,使用方式还和之前一样,首先需要安装: pip3.6 install flask-login 然后在default.py中进行初始化: from flas

一个web应用的诞生(4)

上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据库分为两种,即关系数据库和NoSql数据库,对于中小型的系统来说,两种数据库性能,易用性都相当,都是很好的选择. 基础配置 这里使用SQLAlchemy数据库框架的flask集成包,即flask-SQLAlchemy来进行数据库操作. SQLAlchemy是一个非常好的框架,简化了数据库的操作,即提

Bower —— 一个Web的包管理工具

作者:江剑锋 github地址:https://github.com/bower/bower Bower为何物 Bower是一个Web开发的包管理软件.前端开发中,或多或少,都会以来于现成的framework或者lib,如bootstrap.jquery等.每次编写代码之前,都需要从网上下载,或者从硬盘深处找出珍藏的,项目所依赖的框架或者库文件.同时,所下载的文件,又可能以来与另外的库文件.Bower的诞生,正是为了解决此繁琐的以来关系的. 需要注意的是,Bower的运行,依赖于版本控制工具gi

使用MyEclipse开发第一个Web程序

MyEclipse环境配置 首先,安装一个MyEclipse,然后进行一些相关的环境配置(Window->Preferences): 比如字体.Formatter等. 也可以从Eclipse中导出配置,然后在MyEclipse中导入. 这里需要特别注意的是两个配置: 1.JSP的打开方式: 选为用编辑器打开: Window->Preferences->General->File Associations 然后在右边窗口选jsp,下面选择MyEclipse JSP Editor,在右

ASP.NET MVC Web API 学习笔记---第一个Web API程序

http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html 1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验.所以我相信Web API会越来越有它的用武之地. 说道Web API很多人都会想到Web服务,但是他们仍然有

eclipes创建一个web项目web.xml不能自动更新的原因(web.xml和@WebServlet的作用)

在eclipse中创建一个Web项目的时候,虽然有web.xml生成,但是再添加Servlet类文件的时候总是看不见web.xml的更新,所以异常的郁闷!上网查了查,原来我们在创建Web项目的时候,会弹出一个对话框,“Dynamic web module version”这个选项默认成了3.0,按照老规范,应该是在eclipse的WebContent \ WEB-INF \ 目录下创建web.xml的.而新规范是可以不用web.xml的,如tomcat 7.0就支持新规范,这样相关的servle

cacti监控一个web上的多个tomcat

Cacti监控一个web上多个tomcat 第一部分:监控单个tomcat 1.首先下载监控tomcat的模板 TomcatStats-0.1.zip 下载之后,修改tomcatstats.pl, a.注释第三行左右的 use Data::Dumper; b.将 第19行左右的my $xml = `GET $url`; 改为my $xml = `wget -qO - $url`; c.在第24行左右添加此行   print "  "; d.注释第23行左右的print Dumper($

【读书札记】建立第一个Web项目

安装配置好jdk,tomcat,我用的版本是7.0.54,我放在C:\server\apache-tomcat-7.0.54下, CATALINA_BASE:C:\server\apache-tomcat-7.0.54 CATALINA_HOME:C:\server\apache-tomcat-7.0.54 也可以在Path下面添加配置  ;C:\server\apache-tomcat-7.0.54\bin ,这样就可以在cmd下直接输入startup启动服务器了. 背景:运用web容器tom

python使用Django制作第一个web页面

第一步:打开pycharm,点击File>New File 选择Django,填写完点击Create创建如下图: 第二步:项目名和应用名都写的web,目录列表如下: 第三步:将web目录下面的view.py改成 from django.http import HttpResponse def hello(request): return HttpResponse("<h3>使用Django的第一个web页面</h3><hr>") 第四步:将ur