~/ahoh$ mv app.py app/init.py # 移动app.py并改名
虽然代码做了更改,其实项目现在还是可以正常运行的,不过需要先激活虚拟环境。
然后,使用**应用工厂**函数代替之前的全局变量`app`,修改`__init__.py`如下(之前的代码可以先注释掉):
from flask import Flask
应用工厂函数
def create_app():
app = Flask(__name__)
return app
然后使用`Blueprint`拆分视图函数,通常情况下,**用户**和**博客**是博客系统最主要的两个实体。
我们就用两个独立的文件分别处理用户相关的视图和博客相关的视图。
在`app`文件夹下创建`auth.py`和`blog.py`,分别编辑其中的内容如下:
~/ahoh/app/auth.py 用户蓝图
from flask import Blueprint
bp = Blueprint(‘auth’,name,url_prefix=‘/auth’)
@bp.route(‘/login’,methods=[‘GET’,‘POST’])
def login():
return 'login'
@bp.route(‘/register’,methods=[‘GET’,‘POST’])
def register():
return 'register'
~/ahoh/app/blog.py 博客蓝图
from flask import Blueprint
使用/访问博客蓝图
bp = Blueprint(‘blog’,name,url_prefix=‘/’)
@bp.route(‘/’)
def index():
return 'index'
@bp.route(‘/detail/int:id’)
def detail(id):
return 'detail'
然后在`__init__.py`中注册蓝图,在`create_app()`函数中添加如下代码:
from . import blog,auth # Python 讲究随用随定义,这句可以直接写函数里
app.register_blueprint(blog.bp)
app.register_blueprint(auth.bp)
做完这些之后,蓝图就配置好了,之后的代码里,所有和用户相关的视图都放在`auth.py`里,其他就放在`blog.py`里面,如果随着功能扩展,有新的重要实体,还可以再新建一个模块。
先测试一下改装是否成功,使用`flask run`启动服务,然后在浏览器中输入`localhost:5000/auth/login`,或者输入`localhost:5000/`试试有什么效果吧!
![登录页](https://img-blog.csdnimg.cn/img_convert/d5faf7a62d552577d71843140f374766.png)
![主页](https://img-blog.csdnimg.cn/img_convert/ab645d4e3e69e75afb5d4a630d6874b3.png)
然后就是重新配置`Flask-SQLAlchemy`和`Flask-Migrate`插件,我这里准备单独用一个模块管理这些插件。
首先,在`app`文件夹下创建`exts.py`,然后编辑代码如下:
~/ahoh/app/exts.py 插件模块
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
db = SQLAlchemy()
migrate = Migrate()
然后,在`__init__.py`中的`create_app()`函数中插入以下代码:
from .exts import db,migrate
db.init_app(app)
migrate.init_app(app,db)
这样,两个插件也就准备好了,接下来是配置文件,在`app`文件夹下创建`settings.py`,编辑内容如下:
class Default(object):
SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:_Why62345@localhost/ahoh?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = True
SECRET_KEY='asl;nadflkgaasdfasyfgher' # 这里需要一个非常复杂的密码字符串
class Development(Default):
ENV='development'
DEBUG=True
class Production(Default):
ENV='production'
DEBUG=False
然后,在`__init__.py`文件中的`create_app()`函数中,`app=Flask(__name__)`后,插入如下代码:
app.config.from_object(settings.Default)
这样,配置文件也搞定了。
后面就是模型的配置了,先在`app`文件夹下创建`models.py`文件,然后编辑内容如下:
from exts import db
from datetime import datetime
class TimestampMixin(object):
created = db.Column(
db.DateTime, nullable=False, default=datetime.utcnow)
updated = db.Column(db.DateTime, onupdate=datetime.utcnow)
status = db.Column(db.Integer, default=0)
class User(TimestampMixin, db.Model):
__tablename__ = 't_users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True)
password = db.Column(db.String(127), nullable=False)
def __repr__(self):
return '<User %r>' % self.username
这样我们的模型也就绪了,因为我这里把之前的数据全删掉了,所以还需要走一遍上一篇的创建流程,大家可以试试使用`flask db migrate/upgrade`能不能成功。
如果不能成功升级,直接删掉`migrations`文件夹,删掉数据库,重来。
想要在`Flask Shell`中使用`db.create_all()`创建所有对象,还需要在`__init__.py`中引入`User`。
from .models import User # 这句看起来没什么用,没有还真不行
下面再介绍一遍流程:
(venv)~/ahoh$ flask shell
from app.exts import db
db.create_all()
这样就可以创建表了
然后是,使用`Flask-Migrate`插件:
(venv)~/ahoh$ flask db init
(venv)~/ahoh$ flask db migrate
(venv)~/ahoh$ flask db upgrade
最后还要添加`git`管理的`.gitignore`文件,方便后面使用仓库。
在`ahoh`文件夹下创建`git`的版本控制文件`.gitignore`,然后把下面的内容贴进去:
venv/
migrations/
*.pyc
pycache/
instance/
.pytest_cache/
.coverage
htmlcov/
dist/
build/
*.egg-info/
最后,把`templates`和`static`文件夹复制到`app`文件夹下,并在`templates`文件夹下创建`auth`和`blog`文件夹。
这样所有的项目设置就全部完成了,当前项目的结构:
ahoh/
├── README.en.md
├── README.md
├── app
│ ├── init.py
│ ├── templates # 模板文件
│ │ ├── auth # 用户页面
│ │ ├── blog # 博客页面
│ │ └── bash.html # 模板基类
│ ├── static # 静态文件
│ │ └── style.css # css文件
│ ├── auth.py # 用户蓝图
│ ├── blog.py # 博客蓝图
│ ├── exts.py # 插件模块
│ ├── models.py # 模型模块
│ └── settings.py # 默认设置
├── migrations # 数据版本
└── venv # 虚拟环境
这里还少了`test`文件夹,由于短时间内用不到,就先不搞了。
当前状态的代码保存到了[Gitee仓库]( )的`quickstart`分支。如果没有办法根据教程复现代码,可以直接从这个分支开始。
下面就要测试写一些功能,测试以下改版后的结构有没有问题。
[]( )用户注册
------------------------------------------------------------------
首先就是用户注册视图(`/register`),修改视图函数代码如下:
@bp.route(‘/register’, methods=[‘GET’, ‘POST’])
def register():
print('regist')
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
error = None
if not username:
error = '用户名不能为空'
elif not password:
error = '密码不能为空'
elif User.query.filter_by(username=username).first() is not None:
error = '用户 "{}" 已存在'.format(username)
if error is None:
u = User(username=username,
password=generate_password_hash(password))
db.session.add(u)
db.session.commit()
return redirect(url_for('auth.login'))
flash(error)
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
id工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-MnwcCb6q-1715722460470)]
[外链图片转存中…(img-M5z4oPCO-1715722460470)]
[外链图片转存中…(img-Fzu4R4mM-1715722460470)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!