高内聚,低耦合分布
虽然听上去高大上,其实只是使用多个文件分工合作处理不同的部分的工作,我们可以用前面创建的项目模型实现一个项目,但是当项目足够大的时候,整个代码写在一个文件中显然不现实,那现在就需要把项目分成多个文件,每个文件实现自己的功能同时也是项目的一部分
拟写二手车网站创建项目模块
首先我们在创建的文件下创建一个配置文件config.py和运行文件manage.py,然后创建一个模块文件夹这里就命名为cars,现在的结构应该是这样的
现在我们写内容了,由于flask有循环导入的问题,所以注意调包的顺序
为项目生成密钥
由于flask没有生成密钥,所以我们需要在项目开始前就为项目设置一个密钥
首先在config文件夹下创建一个Config类,继承于object
在Config类中添加
SECRET_KEY ='buoawdfyahusoansbbgfdjfn%&*^rwd^&aRW%*D&AW%T*&^F'
密钥后面部分乱写就可以了,不要和人重复
配置数据库引用,session
先下载两个包,进入虚拟环境,键入
pip install pymysql
pip install redis
然后再之前的Config类中添加
SQLALCHEMY_DATABASE_URI='mysql+pymysql://mysql用户名:mysql密码@127.0.0.1:3306/项目数据库名'
关闭该模块减少资源浪费,在需要的时候再开启
SQLALCHEMY_TRACK_MODIFICATIONS = False
# non_relationship database configration
非关系数据库表设置
REDIS_HOST='127.0.0.1'
REDIS_PORT=6379
#setup sessions extension
设置session扩展
SESSION_TYPE ='redis' # tell flask session extension store sessions into redis用来告诉session把文件存到redis中
SESSION_REDIS=redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT) #create redis connection建立redis链接
SESSION_USE_SIGNER=True #user signature, used when we need to use session_id to crypt in cookie用户签名,用来加密cookie中的session_id
PERMANENT_SESSION_LIFTTIME=60*60*24*2 session的存在时间
为项目创建app
现在在config文件下定义两个Config子类
class DevelopmentConfig(Config):
# open debug
DEBUG=True
class OnlineConfig(Config):
pass
config={
'development':DevelopmentConfig,
'online':OnlineConfig
}
这是为了区分开发和线上配置转换用的,后面的键值提供了引用
这时候转到我们的cars中的__init()__文件中
先通过SQLAlchemy添加数据库句柄,如果你的flask没有SQLAlchemy先导入包
pip install flask-sqlalchemy
然后再文件中加入
from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()
添加一个空的redis存储对象以便之后修改
redis_store=None
现在定义我们创建模块函数
这个函数可以指定不同的config类来运行
from config import config
def create_app(config_name):
# it will use different setting object decide by runnable mode
初始化模块
app = Flask(__name__)
# load config file,which define as an object
指定设置文件
app.config.from_object(config[config_name])
#operate handle of database how to connect to app
创建数据库和模型链接的初始化句柄
db.init_app(app)
创建session
Session(app)
将session实例化
global redis_store
redis_store=redis.StrictRedis(host=config[config_name].REDIS_HOST,port=config[config_name].REDIS_PORT)
return app
创建入口函数和模块实例,以及用命令行管理运行模块
首先先进入虚拟环境,下载包,键入
pip install flask_script
pip install flask_migrate
然后再manage.py文件下添加以下字段
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from cars import create_app,db
创建app实例
app= create_app('development')
用flask-script命令行语言管理模块
manage=Manager(app)
用迁移链接app和数据库
Migrate(app=app,db=db)
往flask-script添加迁移命令
manage.add_command('db_command',MigrateCommand)
创建项目运行入口
if __name__ == '__main__':
manage.run()
测试一下运行和初始化迁移文件
在虚拟环境中键入
python manage.py runserver
python manage.py db_command init
这是运行服务器成功的界面
这是生成迁移文件成功的界面
添加csrf跨站请求伪造保护
在虚拟环境中键入
pip install flask_wtf
然后转到cars中的__init__()文件下,添加csrf保护(注意如果是开始没写前端测试时需要关闭这个功能,否则没法发送请求)
最后的__init()__.py manage.py config.py文件应该是这样的
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from flask_wtf.csrf import CSRFProtect
from flask_session import Session
import redis
from config import config
#define operate handle
db=SQLAlchemy()
csrf=CSRFProtect()
redis_store=None
#setup logging level
# logging.basicConfig(level=logging.DEBUG)
# create logging writer, point where the log should be stored, how much the logging storage will be needed
# file_log_handler=RotatingFileHandler('logs/log',maxBytes=1024*1024,backupCount=10)
# setup the log format
# formatter=logging.Formatter('%(levelname)s %(filename)s %(lineno)d %(message)s')
# setup logging write with formatter
# file_log_handler.setFormatter(formatter)
# add logging writer to the globle logging tools
# logging.getLogger().addHandler(file_log_handler)
def create_app(config_name):
# it will use different setting object decide by runnable mode
app = Flask(__name__)
# load config file,which define as an object
app.config.from_object(config[config_name])
#operate handle of database how to connect to app
db.init_app(app)
Session(app)
csrf.init_app(app)
global redis_store
redis_store=redis.StrictRedis(host=config[config_name].REDIS_HOST,port=config[config_name].REDIS_PORT)
return app
init().py文件
import redis
class Config(object):
SECRET_KEY ='buoawdfyahusoansbbgfdjfn%&*^rwd^&aRW%*D&AW%T*&^F'
# relationship database configration
SQLALCHEMY_DATABASE_URI='mysql+pymysql://debian-sys-maint:NMwBmsUQgRgTWqFM@127.0.0.1:3306/cars'
SQLALCHEMY_TRACK_MODIFICATIONS = False
# non_relationship database configration
REDIS_HOST='127.0.0.1'
REDIS_PORT=6379
#setup sessions extension
SESSION_TYPE ='redis'# tell flask session extension store sessions into redis
SESSION_REDIS=redis.StrictRedis(host=REDIS_HOST,port=REDIS_PORT) #create redis connection
SESSION_USE_SIGNER=True #user signature, used when we need to use session_id to crypt in cookie
PERMANENT_SESSION_LIFTTIME=60*60*24*2
class DevelopmentConfig(Config):
# open debug
DEBUG=True
class OnlineConfig(Config):
pass
config={
'development':DevelopmentConfig,
'online':OnlineConfig
}
config.py文件
#management file
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from cars import create_app,db
app= create_app('development')
manage=Manager(app)
Migrate(app=app,db=db)
manage.add_command('db_command',MigrateCommand)
if __name__ == '__main__':
manage.run()
manage.py文件