说明

  • 操作系统: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 命令即可将我们的网站运行起来。

Flask 系列之 优化项目结构的更多相关文章

  1. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  2. ABP架构学习系列一 整体项目结构及目录

    本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...

  3. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

  4. 【Flask】 项目结构说明

    项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和Django这种框架又不一样,Fl ...

  5. React Native 系列(三) -- 项目结构介绍

    前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...

  6. flask实战-个人博客-虚拟环境、项目结构

    个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...

  7. 一个比较良好的flask项目结构

    一个比较良好的flask项目结构 project/ app/                    # 整个程序的包目录 static/                 # 静态资源文件 js/    ...

  8. 架构系列:ASP.NET 项目结构搭建

    我们头开始,从简单的单项目解决方案,逐步添加业务逻辑的约束,从应用逻辑和领域逻辑两方面考虑,从简单的单个项目逐步搭建一个多项目的解决方案.主要内容:(1)搭建应用逻辑和领域逻辑都简单的单项目 (2)为 ...

  9. Vue.js系列之项目结构说明

    转:https://www.jb51.net/article/111658.htm 前言 在上一篇项目搭建文章中,我们已经下载安装了node环境以及vue-cli,并且已经成功构建了一个vue-cli ...

随机推荐

  1. SDKmanager的位置

    最近学习Android Studio 因为配置的问题,需要查找SDKmanager的位置 一下是查找方法: 查找到啦~

  2. C语言复习6_doWhile循环

    基本语法 do{ 循环操作 }while(循环条件); 特点:先执行,再判断 先执行一遍循环操作 符合条件,循环继续执行 否则循环退出 例题: #include <stdio.h> #in ...

  3. 轻量级C#网络通信组件StriveEngine —— C/S通信开源demo(附源码)

    前段时间,有几个研究ESFramework网络通讯框架的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好 ...

  4. 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)

    散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...

  5. Java面试大纲-java面试该做哪些准备,java开发达到这样的水平可以涨工资

    Java培训结束,面临的就是毕业找工作.在找工作时,就要针对性地做充分的面试准备.准备不充分的面试,完全是浪费时间,更是对自己的不负责. 上海尚学堂Java培训整理出Java面试大纲,其中大部分都是面 ...

  6. [Swift]LeetCode124. 二叉树中的最大路径和 | Binary Tree Maximum Path Sum

    Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...

  7. [Swift]LeetCode498. 对角线遍历 | Diagonal Traverse

    Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal ...

  8. [Swift]LeetCode621. 任务调度器 | Task Scheduler

    Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...

  9. Linux下python2和python3共存

    python下载地址: https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz 下载命令: wget https://www.pytho ...

  10. HBase篇--HBase常用优化

    一.前述 HBase优化能够让我们对调优有一定的理解,当然企业并不是所有的优化全都用,优化还要根据业务具体实施. 二.具体优化 1.表的设计  1.1 预分区 默认情况下,在创建HBase表的时候会自 ...