欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask 系列之 优化项目结构

程序员文章站 2022-04-14 18:24:45
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 完善环境配置,添加 异常请求 处理 实现 400、404 和 500 处理 首先,在 目录下创建一个 400.html 文件,示例代码如下所示: 在 目录下 ......

Flask 系列之 优化项目结构

说明

  • 操作系统: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 的终端却换至该项目根目录下,可执行上面我们自定义的相关目录,如下图所示:

Flask 系列之 优化项目结构

使用前需要先进入到 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)

自此,我们的项目结构和代码已经进一步完善了,完整项目结构如下图所示:

Flask 系列之 优化项目结构

最后,我们可以在 shell 窗口中执行 flask run 命令即可将我们的网站运行起来。