《我用Python写网站03》项目结构设计

应用工厂函数

def create_app():

app = Flask(name)

return app

然后使用Blueprint拆分视图函数,通常情况下,用户博客是博客系统最主要的两个实体。

我们就用两个独立的文件分别处理用户相关的视图和博客相关的视图。

app文件夹下创建auth.pyblog.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/试试有什么效果吧!

登录页

主页

然后就是重新配置Flask-SQLAlchemyFlask-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/

最后,把templatesstatic文件夹复制到app文件夹下,并在templates文件夹下创建authblog文件夹。

这样所有的项目设置就全部完成了,当前项目的结构:

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)

return render_template(‘auth/register.html’)

base.html内容如下:

{% block head %}

{% block title %}{​{title}}{% endblock %} - My Webpage

{% endblock %}

{% block body_content %}

{% endblock %}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

c645858c61d161aec43789.png)

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1BDSlP4e-1712874526743)]

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值