flask框架开始一个工程

万事开头难,每当我们个人要开始一个工程时,在开头的时间里(一般是半天到一天)总是不知道要干什么,面对一个工程的开头老是会无从下手,这是因为每个人在学习新框架的时候往往不是一开始就接触例子工程的所有细节,都是从简单的实现功能开始的,后面再一点一点的在前面的基础上添加内容。这中学习方法的好处是可以很快的了解一个框架的大概(比如我个人学习flask框架的时候),但是缺点是等你全部学完,想做一个完整的工程试手的时候会无从下手(知道大概要怎么做,但不知道具体怎么做)。

所以这也是我写这篇博客的原因,同时,这也是我的第一篇在别人的网站上写的博客(之前都是在自己用flask做的私人网站上写的,虽然那个网站做的很糟糕),可能写得有待提升,希望大家有什么意见或者建议,欢迎在评论或直接发送到我的邮箱: JosenChina@126.com  

OK,废话不多说了,开始我的表演吧!

这里我使用PyCharm2018来开发一个项目:

打开PyCharm,可以弹出如下界面,点击 create new project

然后在弹出新界面里点击flask,选择location用于保存工程的位置,在目录最后记得修改工程名称,否则工程名默认为untitled(像我这样的强迫症患者很难接受),python的其中一个优势就是可以任意创建自己的虚拟运行环境(建议每个工程都运行在自己的虚拟环境中,这样既可以避免不同工程之间的相互冲突,也可以使代码在部署时尽量轻量化,需要什么就pip什么),虚拟环境目录默认是在工程的目录下,而且如果使用git的话,venv(虚拟环境目录)不会被添加到分支中去,从而避免不同操作系统部署同一个工程时由于虚拟环境的支持不同而出现的乱七八糟的问题。

点击create,一个工程的初始界面就建好了,工程里包含了PyCharm为我们默认添加的文件,app.py为整个工程的启动入口,日点击右上角的绿色三角形可以运行该工程,因为该工程现在只有默认的几个函数,结构比较简单,但是还是可以运行的。

OK,从这一步开始,下面的将是我个人自学习flask以来的编程风格,不一定是最好,但是可以参考下。

首先,先让我们来看下整个工程的文件结构:

首先,先创建一个新目录用于存放所有的代码(几乎所有),这里我使用webapp,再将原来的static文件夹和template文件夹移动到该文件夹里,这样做目的是使代码的结果更加清晰,利于后期工程的扩展。在这里,我们还需要创建models文件夹(需要在里面创建“__init__.py”文件,也可以直接右击webapp->new->python package直接创建python包),这个包的作用是存放与数据库各表对应的模型的类,同样可以创建admin包(用于保存管理员部分的代码)、user包(用于保存用户部分的代码)、main包(用于保存实现整个网站或系统基本功能的代码)、api包(用于保存对外接口部分的代码)、other包(用于存放其他辅助功能的代码(函数、类、修饰器等))。其中,admin、user、main、api四个模块需要直接与客户端进行交互,需要用到(route路由,而route路由一般存放在view.py视图文件里),所以这四个文件下要创建view.py视图文件和form.py文件(用于存放客户端的表单,api为对外窗口,不需要表单)。

接下来,在工程的根目录下,创建一个requirements文件夹,里面一般只存放两个文件,dev.txt(记录了开发阶段需要的运行环境, 在开发环境下通过 pip freeze > requirements/dev.txt)和pro.txt(记录了生产环境需要的运行环境)

在根目录下还需要创建的还有两个python文件,分别是config.py和manager.py,其中,config.py存放了整个工程的配置信息,manager.py的作用是用于代码的实时调试,包括shell环境的开启(python manager.py shell),以及数据库的初始化、更改、删除等操作(python manager.py db init——初始化、python manager.py db migrate -m 'info'——修改、python manager.py db upgrade——更新)

到这一步,整个工程的文档结构就已经初步建成了,接下来,就是开始一个工程的第二部操作——创建各个模块的蓝本(blueprint)。

我们前面已经在webapp目录下创建了各个模块(admin、user、main等),其中admin、user、main、api四个模块由于需要直接与客户端进行交互,需要用到路由函数(route)、为了使代码结构更加合理、我们需要在各个模块的根部都创建一个蓝本(blueprint),并且在webapp的根部的create_app函数(后面会讲)中注册该蓝本,使蓝本可以运行。(注意:在创建完蓝本后,需要在蓝本的后面或下一行将该模块的视图文件导入(from . import view),目的是将所有的路由函数写入该蓝本)。

接下来,我们需要将这四个蓝本注册到app中去,我们在webapp的根目录下创建create_app函数,具体代码如下:

 

webapp/admin/__init__.py :

# _*_ coding: utf-8 _*_
# filename: __init__.py
from flask import Blueprint
_admin = Blueprint('admin', __name__)        # 蓝本名为“_admin”, 这里为了避免名字与系统变量名重叠,在变量名前添加下划线区分, Blueprint函数里的admin参数表示路由名,例如(url_for('admin.index'), 不能调用为url_for('_admin.index'))

from . import view                           # 这一步很重要, 作用是把所有的视图都写入到蓝本中去

webapp/main/__init__.py :

# _*_ coding: utf-8 _*_
# filename: __init__.py
from flask import Blueprint
_main = Blueprint('main', __name__)


from . import view

webapp/user/__init__.py :

# _*_ coding: utf-8 _*_
# filename: __init__.py
from flask import Blueprint
_user = Blueprint('user', __name__)


from . import view

webapp/api/__init__.py :

# _*_ coding: utf-8 _*_
# filename: __init__.py
from flask import Blueprint
_api = Blueprint('api', __name__)


from . import view

webapp/__init__.py :

# _*_ coding: utf-8 _*_
# filename: __init.py

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
db = SQLAlchemy()


def create_app(config_name):
    import sys                                   # 这三句很重要,因为python2默认的编码格式不是utf-8,这三句话的作用就是手动指定python的编码格式,否则如果系统里有中文或其他非英文字体,很容易出错
    reload(sys)                                
    sys.setdefaultencoding('utf-8')            
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    bootstrap.init_app(app)
    db.init_app(app)

    # 注册蓝本
    from .main import _main as main_blueprint
    from .admin import _admin as admin_blueprint
    from .user import _user as user_blueprint  
    from .api import _api as api_blueprint
    app.register_blueprint(main_blueprint, url_prefix='/main')
    app.register_blueprint(admin_blueprint, url_prefix='/admin')
    app.register_blueprint(user_blueprint, url_prefix='/user')
    app.register_blueprint(api_blueprint, url_prefix='/api')
    return app

接下来我们看一下manager.py文件:

# _*_ coding: utf-8 _*_
# filename: manage.py
import os
from webapp import db, create_app
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
from webapp.models import *

app = create_app(os.environ.get('FLASKY_CONFIG') or 'default')            # 实例化app
manager = Manager(app)                                                    # 实例化manager
migrate = Migrate(app, db)                                                # 实例化migrate(数据库调试命令)


def make_shell_context():
    return dict(app=app, db=db)


manager.add_command('shell', Shell(make_context=make_shell_context))        # 添加shell参数命令(python manager.py shell)
manager.add_command('db', MigrateCommand)                                   # 添加db参数命令(python manager.py db init)


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

以及app.py文件(系统的入口):

# _*_ coding: utf-8 _*_
# filename: JosenBlog.py
import os
from webapp import create_app
from flask import redirect, url_for

app = create_app(os.environ.get('FLASKY_CONFIG') or 'default')                # 实例化app


@app.route('/')                                                               # 系统首页
def Index():
    return redirect(url_for('main.index'))                                    # 返回主目录首页


if __name__ == '__main__':
    app.run()                                                                 # 运行系统

 

补充:template目录用于存放模板(html模板),需要与app的创建函数(create_app)放在同一python包内;static用于存放系统的静态资源(例如:系统的图片、logo、css文件、js文件等,但不适合用来存放系统用户的资源,容易给系统造成巨大的压力,从而降低运行速度,用户的资源一般存放在另一台专用的资源服务器上或者对象存储上)。

 

人无完人,以上内容可能有什么不对的或需要完善的地方,欢迎各位大佬在评论去或我的邮箱(JosenChina@126.com)提出宝贵的建议,肉松感激不尽!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值