• Flask 系列之 优化项目结构


    说明

    • 操作系统:Windows 10
    • Python 版本:3.7x
    • 虚拟环境管理器:virtualenv
    • 代码编辑器:VS Code

    实验目标

    完善环境配置,添加 异常请求 处理

    实现

    400、404 和 500 处理

    首先,在 todolistapp emplateserrors 目录下创建一个 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 %}
    

    todolistapp emplateserrors 目录下创建一个 404.html 文件,示例代码如下所示:

    {% extends 'base.html' %} {% block content %}
    <div class="text-center animated fadeInDown">
        <h1>404</h1>
        <h3> 页面未能够找到!! !</h3>
        <div>
            抱歉,页面好像去火星啦!
        </div>
    </div>
    
    {% endblock %}
    

    todolistapp emplateserrors 目录下创建一个 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 %}
    

    接着,在 todolistapp 目录下创建 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

    todolistapp 目录下创建 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 中,具体可参考 下面的 todolistapp\__init__.py 代码。

    完善 Config 配置

    首先,修改 todolistconfig.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
    }
    

    接着,修改 todolistapp\__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
    

    最后,修改 todolistmanage.py 文件,示例代码如下所示:

    from app import app
    
    
    if __name__ == "__main__":
        app.run(debug=True, host='0.0.0.0', port=5000)
    
    

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

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

  • 相关阅读:
    mycat实例(1)
    Java连接Oracle数据库的示例代码
    文本处理grep命令
    回调函数
    算法基础--快排序,堆排序,归并排序
    c++ 中double与string之间的转换,char *
    c++ 类型转换
    allocator class
    csapp读书笔记-并发编程
    树的遍历-递归方法,非递归方法
  • 原文地址:https://www.cnblogs.com/hippieZhou/p/10608840.html
Copyright © 2020-2023  润新知