Flask目录结构
程序员文章站
2022-07-09 19:03:44
说明:flask 非常灵活,它没有一个固定的项目目录组织结构,以下内容仅供参考。 结果:如图所示,此目录结构为本人正在使用的结构。 conf/default.py:存储了Flask的一些配置内容。 main/__init__.py:存储蓝图的目录。 ops/__init__.py:定义程序,初始化一 ......
说明:flask 非常灵活,它没有一个固定的项目目录组织结构,以下内容仅供参考。
结果:如图所示,此目录结构为本人正在使用的结构。
- conf/default.py:存储了flask的一些配置内容。
- main/__init__.py:存储蓝图的目录。
- ops/__init__.py:定义程序,初始化一些对象。
- model/db.py: 定义数据库中数据表。
- static:存储js、css文件。
- templates:存储html静态页面模板。
- run.py:程序入口。
1. conf/default.py注释:
import os
class config:
# 使用导入的os模块来生成随机秘钥,此秘钥用于flask中的session。 secret_key = os.urandom(24)
# 数据库相关定义,将其设为true时,每次请求结束后都会自动提交数据库中的变动(不过我数据库做更改还是写了commit =.=;) sqlalchemy_commit_on_teardown = true # 将config类作为参数传递到其他函数中,又希望在实例化config类之前就能提供下列的功能,所以使用staticmethod. @staticmethod def init_app(app): pass # 继承config类,下列定义数据库地址,可以定义多个环境(testingconfig="测试环境",developmentconfig="开发环境"...) class testingconfig(config): sqlalchemy_database_uri = 'mysql://test:test@192.168.xx.xx:3306/test?charset=utf8'
# 如果设置成 true (默认情况),flask-sqlalchemy将会追踪对象的修改并且发送信号.这需要额外的内存,如果不必要的可以禁用它 sqlalchemy_track_modifications = false # 同上 class developmentconfig(config): sqlalchemy_database_uri = 'mysql://dev:dev@192.168.xx.xx:3306/dev?charset=utf8' sqlalchemy_track_modifications = false # 定义字典,方便其他.py文件引用 config = { 'default': developmentconfig, 'testing': testingconfig }
2.main/__init__.py
from flask import blueprint, jsonify, request, render_template, session, json from ops import db, and_ from model.db import user # 定义蓝图,指定模板位置及static文件位置,下面有说明 users = blueprint('user',__name__,template_folder='../templates',static_folder='../static')
# 因为定义了蓝图,所以就要写"@users.xxx". @users.route('/register',methods=['get','post']) # 创建用户 def register(): if request.method == 'post':
# 这里的data中的数据是获取的前端的ajax里边的数据. data = json.loads(request.form.get('register_data')) if data: user = data['register_user'] passwd = data['register_password'] re_password = data['repeatpassword']
# 前往数据库查询数据 alreay = user.query.filter(user.name == user).first()
'''
下列的return jsonify都是返还给ajax一个字典,前端ajax调用结果进行弹窗.
''' if alreay: return jsonify({'code': '300', 'data': '用户已存在!'}) elif passwd != re_password: return jsonify({'code': '100', 'data': '注册密码与确认密码不一致'}) insert = user(name=user,password=passwd,status=0) db.session.add(insert) db.session.commit() return jsonify({'code': '200','data':'用户创建成功!'}) return render_template('register.html')
# 下列内容与上述内容大同小异,不做过多解释 @users.route('/forbidden',methods=['post']) # 禁用用户 def forbidden(): data = json.loads(request.form.get('data')) web_user = data['user'] forbidden = user.query.filter(and_(user.name == web_user, user.status == '1')).first() if forbidden: if forbidden.status == "1": forbidden.status = 0 db.session.commit() return jsonify({"code": "200", "data": "账户禁用完成!"}) return jsonify({"code": "300", "data": "账户已被禁用!"}) @users.route('/start_using',methods=['post']) # 激活用户 def start_using(): data = json.loads(request.form.get('data')) web_user = data['user'] start_using = user.query.filter(and_(user.name == web_user, user.status == '0')).first() if start_using: if start_using.status == "0": start_using.status = 1 db.session.commit() return jsonify({"code": "300", "data": "账户启用完成!"}) return jsonify({"code": "300", "data": "账户已被启动!"}) @users.route('/del_user',methods=['post']) def del_user(): data = json.loads(request.form.get('data')) del_user = data['user'] web_user = session['user'] update_pass = user.query.filter(user.name == del_user).first() if update_pass: if web_user == 'admin': db.session.delete(update_pass) db.session.commit() db.session.execute('alter table user_info auto_increment 1') return jsonify({"code": "200","data":"账户删除成功!"}) return jsonify({'code': '500','data':'你无权删除用户'}) @users.route('/check') # 页面展示数据库中的用户数据 def check(): count = user.query.count() name = user.query.all() return render_template('user_list.html',name=name,count=count)
3.ops/__init__.py
'''
下列很多模块实际在这个文件中并没有用到,导入到这个文件的目的就是防止python中的循环导入问题.
'''
from flask import flask,render_template, request, session, redirect, jsonify import os, jsonfrom sqlalchemy import and_ from werkzeug.security import generate_password_hash, check_password_hash from flask_sqlalchemy import sqlalchemy
# 导入前面定义的flask的设置. from conf.default import config # 初始化对象,以后续.py引用. db = sqlalchemy() # 定义个方法,方便引用,接受引用传参; def app_create(config_name):
# 导入users,因为main文件夹下边的__init__.py文件中有users,这个users是蓝图 from main import users
'''
初始化程序,定义模板路径,因为在这里初始化了那么程序就相当于在ops/目录下,但是
默认情况下"templates"路径是和程序同级的,但是这里templates和ops同级,所以
模板路径就要手动定义
一句话就是 模板的位置是相对于程序
static位置同理
''' app = flask(__name__,template_folder='../templates',static_folder='../static')
# 上面导入了蓝图,这里需要注册蓝图. app.register_blueprint(users)
# 这里调用前面定义的配置文件的对象 app.config.from_object(config[config_name])
# 初始化配置. config[config_name].init_app(app)
# 初始化数据库,官方定义. db.init_app(app)
# 将程序返回,使.py文件可调用全部初始化过的程序. return app
4.model/db.py
# 导入ops中创建的db对象
from ops import db # sqlalchemy固定语法 class user(db.model): __tablename__ = 'user_info' id = db.column(db.integer, primary_key=true) status = db.column(db.integer,nullable=false) name = db.column(db.string(40),unique=true) password = db.column(db.string(128),nullable=false) # 自定义输出结果 def __repr__(self): return str('%r') % self.name
5.run.py
# 导入前面创建的"程序创建"方法
from ops import app_create
# 导入模型中的 from model.db import user from ops import render_template, request, session, redirect, jsonify, os, json, generate_password_hash, check_password_hash app = app_create(os.getenv('flask_config') or 'testing') @app.before_request # 判断用户是否登录,是否缓存在session中 def is_login(): if 'user' not in session \ and request.endpoint != 'login' \ and '/static/' not in request.path: return redirect('/login') @app.route('/login',methods=['get','post']) # 用户登录 def login(): # 如果以get请求当前url,直接返回html页面 if request.method == 'get': return render_template('login.html') ''' 如果以post请求的话则将前端js返回的数据与数据库中的数据进行对比,对比成功后返回结果 ''' if request.method == 'post': data = json.loads(request.form.get('data')) username = data['username'] passwd = data['password'] result = user.query.filter(user.name==username).first() if result: sql_pass_encrypt = generate_password_hash(result.password) if result.name == username and check_password_hash(sql_pass_encrypt,passwd): session['user'] = username return jsonify({"code": "200","data": ""}) return jsonify({"code": "500","data": "无效的用户名或密码!"}) return jsonify({"code":"300","data":"用户不存在!"}) @app.route('/') # 页面主页 def index(): return render_template('index.html',username=session['user']) if __name__ == '__main__': app.run()
调用关系:
# 注册蓝图
ops/__init__.py -> main/users
#引用配置文件
oss/__init__.py -> conf/default.py
# 加载数据库配置
run.py -> model/db.py
上一篇: 并列第二的有一百多位
下一篇: 理解并测试什么是Android事件分发