Flask 系列之 优化项目结构
程序员文章站
2022-04-14 18:24:45
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 完善环境配置,添加 异常请求 处理 实现 400、404 和 500 处理 首先,在 目录下创建一个 400.html 文件,示例代码如下所示: 在 目录下 ......
说明
- 操作系统:windows 10
- python 版本:3.7x
- 虚拟环境管理器:virtualenv
- 代码编辑器:vs code
实验目标
完善环境配置,添加 异常请求 处理
实现
400、404 和 500 处理
首先,在 todolist\app\templates\errors
目录下创建一个 400.html 文件,示例代码如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeindown"> <h1>400</h1> <h3> 错误请求!! !</h3> <div> <a href="{{ url_for('index') }}">返回首页</a> </div> </div> {% endblock %}
在 todolist\app\templates\errors
目录下创建一个 404.html 文件,示例代码如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeindown"> <h1>404</h1> <h3> 页面未能够找到!! !</h3> <div> 抱歉,页面好像去火星啦! </div> </div> {% endblock %}
在 todolist\app\templates\errors
目录下创建一个 500.html 文件,示例代码如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeindown"> <h1>500</h1> <h3> 内部异常!! !</h3> <div> <a href="{{ url_for('index') }}">返回首页</a> </div> </div> {% endblock %}
接着,在 todolist\app
目录下创建 errors.py 文件,,注册 400、 404 、500 路由处理函数,示例代码如下所示:
from flask import render_template from app import app @app.errorhandler(400) def bad_request(e): return render_template('errors/400.html'), 400 @app.errorhandler(404) def page_not_found(e): return render_template('errors/404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('errors/500.html'), 500
添加 cli
在 todolist\app
目录下创建 commands.py 文件,示例代码如下所示:
import click from app import app, db from app.models import user, thing @app.cli.command() @click.option('--drop', is_flag=true, help='create after drop.') def initdb(drop): if drop: db.drop_all() db.create_all() print("initialized database.") @app.cli.command() @click.option('--username', prompt=true, help='the username used to login.') @click.option('--email', prompt=true, help='the email used to identity.') @click.option('--password', prompt=true, hide_input=true, confirmation_prompt=true, help='the password used to login.') def admin(username, email, password): db.create_all() user = user.query.first() if user: print("updating user...") user.name = username user.email = email user.generate_password_hash(password) else: print("creating user...") user = user(name="hippiezhou") user.email = email user.generate_password_hash(password) db.session.add(user) db.session.commit() print('done.')
此时,可以将 vs code 的终端却换至该项目根目录下,可执行上面我们自定义的相关目录,如下图所示:
使用前需要先进入到 app 中,具体可参考 下面的
todolist\app\__init__.py
代码。
完善 config 配置
首先,修改 todolist\config.py
文件,示例代码如下所示:
import os basedir = os.path.abspath(os.path.dirname(__file__)) class config(object): sqlalchemy_track_modifications = false secret_key = "you will never known it." class develpmentconfig(config): debug = true sqlalchemy_database_uri = os.environ.get( 'dev_database_url') or 'sqlite:///' + os.path.join(basedir, 'todo.sqlite') class productionconfig(config): debug = false sqlalchemy_database_uri = os.environ.get( 'sqlalchemy_database_uri') or 'mysql+pymysql://root:mysql@127.0.0.1:3306/todo' config = { 'development': develpmentconfig, 'production': productionconfig }
接着,修改 todolist\app\__init__.py
文件,示例代码如下所示:
from flask import flask from flask_bootstrap import bootstrap from flask_sqlalchemy import sqlalchemy from flask_login import loginmanager from config import config app = flask(__name__) app.config.from_object(config['development']) bootstrap = bootstrap(app) db = sqlalchemy(app) login_manager = loginmanager(app) login_manager.login_view = 'login' login_manager.login_message = '你必须登陆后才能访问该页面' login_manager.login_message_category = "info" @login_manager.user_loader def load_user(user_id): from app.models import user user = user.query.get(int(user_id)) return user @app.context_processor def inject_user(): from app.models import user user = user.query.first() return dict(user=user) from app import views, errors,commands
最后,修改 todolist\manage.py
文件,示例代码如下所示:
from app import app if __name__ == "__main__": app.run(debug=true, host='0.0.0.0', port=5000)
自此,我们的项目结构和代码已经进一步完善了,完整项目结构如下图所示:
最后,我们可以在 shell 窗口中执行 flask run 命令即可将我们的网站运行起来。