flask以高内聚,低耦合分布管理项目

本文介绍了如何通过多个文件来实现一个高内聚、低耦合的二手车网站项目,详细讲解了创建项目模块、生成密钥、配置数据库和session、创建app、设置命令行管理以及添加CSRF保护的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高内聚,低耦合分布

虽然听上去高大上,其实只是使用多个文件分工合作处理不同的部分的工作,我们可以用前面创建的项目模型实现一个项目,但是当项目足够大的时候,整个代码写在一个文件中显然不现实,那现在就需要把项目分成多个文件,每个文件实现自己的功能同时也是项目的一部分

拟写二手车网站创建项目模块

首先我们在创建的文件下创建一个配置文件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文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值