搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
数据结构灵魂
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
matlab学习指南(2):安装工具箱Toolbox的方法(详细图解)_matlab toolbox
2
【数据分析大作业 爬虫+数据清洗+可视化分析】Python抓取视频评论并生成词云、情感指数柱状图、性别比例饼图及评论信息表格_python数据分析大作业
3
【IDEA】idea一直处于scanning files to index状态然后闪退_idea indexing 闪退
4
Android 样式小结_在程序的res/values/styles.xml文件中创建一个名为hline的样式与一个名为vli
5
YOLOv7教程系列:一、基于自定义数据集训练专属于自己的目标检测模型(保姆级教程,含数据集预处理),包含对train.py/test.py/detect.py/export.py详细说明_yolov7 export.py
6
【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)
7
mysql命令练习_mysql查询年龄大于18
8
ENFP型人格的特征分析(mbti性格测试)_怎么测自己是enfp
9
单元测试系列 | 如何更好地测试依赖外部接口的方法_单元测试依赖
10
【Golang】go编程语言适合哪些项目开发?
当前位置:
article
> 正文
Flask 项目实战教程。。。_flask项目实战
作者:数据结构灵魂 | 2024-01-31 19:23:19
赞
踩
flask项目实战
flask 不仅简介小巧,同时运用的时候十分灵活。下面简单介绍一下如何编写一个 flask项目。涉及调用开发服务器,数据库连接以及 ORM 映射,还有数据库的迁移,模板使用。后期再完善会话,管理后台,缓存等。
一 安装环境
我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移。
[plain]
view plain
copy
$ pip install flask
$ pip install SQLAlchemy==0.7.9
$ pip install flask-sqlalchemy
$ pip install flask-migrate
二 建立项目
flask 没有 django 那样原生的 manage管理工具(flask-admin可以实现,日后再说)。因此我们需要手动建立目录。新建一个 myproject目录,在里面建 app tmp两个文件夹,然后在 app文件夹里面建立 static, templates 两个文件夹,用来存储静态文件和模板。最后目录结构如下:
.
├── app
│ ├── static
│ ├── templates
└── tmp
三 初始化文件
建立一些文件,在 app文件里建立 __init__.py models.py views.py 然后在与app 同目录下建立 config.py 和 run.py 此时的目录结构如下:
(env)ghost@ghost-H61M-S2V-B3:~/project/python/flask/project$ tree
.
├── app
│ ├── static
│ ├── templates
│ ├── __init__.py
│ ├── models.py
│ ├── views.py
├── config.py
├── run.py
└── tmp
四 开始项目
1 hello wrod
打开 (/app/__init.py) 文件,写入
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
flask
import
Flask
# 引入 flask
app = Flask(__name__)
# 实例化一个flask 对象
import
views
# 导入 views 模块
# from app import views
注意,我们的 app 文件夹其实是一个python包,from app import views 这句话也就是从 包app里面导入 views模块,所以写成注释的那句话也没错,其他代码实践喜欢写成后面那种
现在我们来开始写我们的视图,打开 (/app/views.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
app
import
app
from
models
import
User, Post, ROLE_USER, ROLE_ADMIN
@app
.route(
'/'
)
def
index():
return
'hello world, hello flask'
下一步我们将要启动我们的开发服务器,打开 (/run.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
app
import
app
if
__name__ ==
'__main__'
:
app.debug =
True
# 设置调试模式,生产模式的时候要关掉debug
app.run()
# 启动服务器
这段代码需要注意第一句 from app import app。也许会有疑问,我们的 app 包里,貌似没有 app.py 这样的模块。其实这是 flask 方式和python的导入方式。from app 指导入 app 包里的 __iniy__.py 所以这句话的含义是导入 __.init__.py 里面的 app实例。
打开shell 运行
[html]
view plain
copy
$ python run.py
(env)ghost@ghost-H61M-S2V-B3:~/project/python/flask/project$ python run.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader
用浏览器打开 http://127.0.0.1:5000/ 将会看到一个输入 hello world 的页面
2 连接数据库
下面开始连接数据库引擎 先要做一个简单的配置 打开 (/config.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
import
os
basedir = os.path.abspath(os.path.dirname(__file__))
SQLALCHEMY_DATABASE_URI =
'sqlite:///%s'
% os.path.join(basedir,
'app.db'
)
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir,
'db_repository'
)
CSRF_ENABLED =
True
SECRET_KEY =
'you-will-never-guess'
然后打开 (/app/__init__.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
import
os
from
flask
import
Flask
from
flask.ext.sqlalchemy
import
SQLAlchemy
from
config
import
basedir
app = Flask(__name__)
app.config.from_object(
'config'
)
# 载入配置文件
db = SQLAlchemy(app)
# 初始化 db 对象
# from app import views, models # 引用视图和模型
import
views, models
打开 (/app/models.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
app
import
db
ROLE_USER =
0
ROLE_ADMIN =
1
class
User(db.Model):
id = db.Column(db.Integer, primary_key=
True
)
nickname=db.Column(db.String(
60
), index=
True
, unique=
True
)
email = db.Column(db.String(
120
), index=
True
, unique=
True
)
role = db.Column(db.SmallInteger, default=ROLE_USER)
def
__repr__(
self
):
return
'<User %r>'
%
self
.nickname
我们的模型建立了一个 user类,正好是 数据库里面的 user 表,表有四个字段
现在我们的数据库配置已经好了,可是还没有建立数据库。新建一个文件 (/db_create.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
migrate.versioning
import
api
from
config
import
SQLALCHEMY_DATABASE_URI
from
config
import
SQLALCHEMY_MIGRATE_REPO
from
app
import
db
import
os.path
db.create_all()
if
not
os.path.exists(SQLALCHEMY_MIGRATE_REPO):
api.create(SQLALCHEMY_MIGRATE_REPO,
'database repository'
)
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
else
:
api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))
这个脚本是完全通用的,所有的应用路径名都是从配置文件读取的。当你用在自己的项目时,你可以把脚本拷贝到你的项目目录下就能正常使用了。
打开shell 运行
[html]
view plain
copy
$ python db_create_db
运行这条命令之后,你就创建了一个新的app.db文件。这是个支持迁移的空sqlite数据库,同时也会生成一个带有几个文件的db_repository目录,这是SQLAlchemy-migrate存储数据库文件的地方,注意如果数据库已存在它就不会再重新生成了。这将帮助我们在丢失了现有的数据库后,再次自动创建出来。
运行
[html]
view plain
copy
slqite3 app.db
>
>
>
.tables
>
>
>
user
或者使用 sqlite 图形化客户端,没有需要安装 (windows 下直接下载安装包即可)
[html]
view plain
copy
$ sudo apt-get install sqlitebrowser
3 数据库迁移
每当我们更改了 models 。等价于更改了数据库的表结构,这个时候,需要数据库同步。新建 (/db_mirgate.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
import
imp
from
migrate.versioning
import
api
from
app
import
db
from
config
import
SQLALCHEMY_DATABASE_URI
from
config
import
SQLALCHEMY_MIGRATE_REPO
migration = SQLALCHEMY_MIGRATE_REPO +
'/versions/%03d_migration.py'
% (api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO) +
1
)
tmp_module = imp.new_module(
'old_model'
)
old_model = api.create_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
exec
old_model
in
tmp_module.__dict__
script = api.make_update_script_for_model(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, tmp_module.meta, db.metadata)
open(migration,
"wt"
).write(script)
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print
'New migration saved as '
+ migration
print
'Current database version: '
+ str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))
这个脚本看起来很复杂,SQLAlchemy-migrate通过对比数据库的结构(从app.db文件读取)和models结构(从app/models.py文件读取)的方式来创建迁移任务,两者之间的差异将作为一个迁移脚本记录在迁移库中,迁移脚本知道如何应用或者撤销一次迁移,所以它可以方便的升级或者降级一个数据库的格式。
开始数据库迁移
$ python db_mirgate.py
New migration saved as db_repository/versions/001_migration.py Current database version: 1
相应的,我们继续创建数据库 升级和回退的脚本
(/db_upgrade)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
migrate.versioning
import
api
from
config
import
SQLALCHEMY_DATABASE_URI
from
config
import
SQLALCHEMY_MIGRATE_REPO
api.upgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
print
'Current database version: '
+ str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))
(/db_downgrade.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
migrate.versioning
import
api
from
config
import
SQLALCHEMY_DATABASE_URI
from
config
import
SQLALCHEMY_MIGRATE_REPO
v = api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
api.downgrade(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, v -
1
)
print
'Current database version: '
+ str(api.db_version(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO))
4 操作数据库
接下来,我们定义一个新的models class 并做第二次迁移归并
打开(/app/models.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
app
import
db
ROLE_USER =
0
ROLE_ADMIN =
1
class
User(db.Model):
id = db.Column(db.Integer, primary_key=
True
)
nickname=db.Column(db.String(
60
), index=
True
, unique=
True
)
email = db.Column(db.String(
120
), index=
True
, unique=
True
)
role = db.Column(db.SmallInteger, default=ROLE_USER)
posts = db.relationship(
'Post'
, backref =
'author'
, lazy =
'dynamic'
)
def
__repr__(
self
):
return
'<User %r>'
%
self
.nickname
class
Post(db.Model):
id = db.Column(db.Integer, primary_key=
True
)
body = db.Column(db.String(
140
))
timestamp = db.Column(db.DateTime)
user_id = db.Column(db.Integer, db.ForeignKey(
'user.id'
))
def
__repr__(
self
):
return
'<Post %r>'
% (
self
.body)
这里我们进行了两个class 的关联。
[html]
view plain
copy
$ python db_mirgrate.py
New migration saved as db_repository/versions/002_migration.py Current database version: 2
打开 (/app/views.py)
[python]
view plain
copy
# -*- coding: utf-8 -*-
from
flask
import
render_template, flash, redirect, session, url_for, request, g
from
app
import
app, db
from
models
import
User, Post, ROLE_USER, ROLE_ADMIN
@app
.route(
'/'
)
def
index():
return
render_template(
'index.html'
)
@app
.route(
'/adduser/<nickname>/<email>'
)
def
adduser(nickname, email):
u = User(nickname=nickname, email=email)
try
:
db.session.add(u)
db.session.commit()
return
'add successful'
except
Exception, e:
return
'something go wrong'
@app
.route(
'/getuser/<nickname>'
)
def
getuser(nickname):
user = User.query.filter_by(nickname=nickname).first()
return
render_template(
'user.html'
, user=user)
@app
.errorhandler(
404
)
def
internal_error(error):
return
render_template(
'404.html'
),
404
@app
.errorhandler(
500
)
def
internal_error(error):
db.session.rollback()
return
render_template(
'500.html'
),
500
这次我们使用了模板, 新建(/app/templates/user.html)
[html]
view plain
copy
<
html
>
<
head
>
<
title
>
user
</
title
>
</
head
>
<
body
>
<
h1
>
user
</
h1
>
<
ul
>
<
li
>
user: {{ user.nickname }}
</
li
>
<
li
>
email: {{ user.email }}
</
li
>
</
ul
>
</
body
>
</
html
>
最后运行
[html]
view plain
copy
$ python run.py
用浏览器访问 http://127.0.0.1:5000/adduser/username/useremail
最后还可以用 sqlite 客户端打开查看我们的数据库变换。关于更多的数据库操作方法,请阅读 sqlalchemy文档。
最后我们的代码目录结构如下:
(env)ghost@ghost-H61M-S2V-B3:~/project/python/flask/project$ tree
.
├── app
│ ├── __init__.py
│ ├── models.py
│ ├── static
│ ├── templates
│ │ ├── 404.html
│ │ ├── 500.html
│ │ ├── index.html
│ │ └── user.html
│ ├── views.py
├── app.db
├── config.py
├── db_create.py
├── db_downgrade.py
├── db_migrate.py
├── db_repository
│ ├── __init__.py
│ ├── manage.py
│ ├── migrate.cfg
│ ├── README
│ └── versions
│ ├── 001_migration.py
│ ├── 002_migration.py
│ ├── __init__.py
├── db_upgrade.py
├── requirements.txt
├── run.py
├── tmp
代码下载:
https://github.com/rsj217/flask-extend/tree/master/project
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/article/detail/51648
推荐阅读
article
【
Vue
】【
Python
】【
Flask
】
Vue
连接
Python
Flask
后端跨域
问题
,以及GET能...
Vue
项目如果连接Pyhton后端通常会存在跨域的
问题
,最开始我是用nginx解决的,后来发现
flask
有一个
flask
...
赞
踩
article
Flask
框架解决
跨域
问题
_
python
flask
接口
允许
跨域
访问...
flask
db migrate # 生成迁移文件。
flask
db upgrade # 执行迁移文件。# 创建同步数据...
赞
踩
article
Flask
No
Access
-
Control
-
Allow
-
Origin
跨域
问题_
flask
不...
如果不是浏览器请求python-
flask
接口的同学,不用往下看了原因:一般自己写的项目,前后端都是存放在同一个域名下的...
赞
踩
article
Python
+
Vue
+
Flask
,
打造让面试官
眼前一亮
的
在线视频
网站...
近期 ChatGPT 非常火爆
,
它宣告着人工智能更上一个台阶
,
人工智能主要的开发语言就是
Python
。然而
,
如果单纯学...
赞
踩
article
Python-Flask-
ajax
-接口无响应/跨域问题-(
strict
-
origin
-
when
-c...
起因/目的抽空写前端JQuery时,配合用到python的
flask
框架形式接口给前端对接-当发现前端调用和接口根本就没...
赞
踩
article
20210724-
flask
-跨域调用问题-
blocked
by CORS
policy
_pytho...
问题背景:
flask
服务启动后,用westorm的项目去访问
flask
的服务接口,提示‘。。。has been bloc...
赞
踩
article
python
开发-
Flask
与
Vue
基础_
python
flask
vue
...
dev_
python
flask
vue
python
flask
vue
...
赞
踩
article
Django
、
Flask
与 Javascirpt 之间传值与
数据
转换
...
本文介绍了,在python 中 dict, json类型定义与区别,
转换
方法,在javascript 中 object与...
赞
踩
article
基于
Python
flask
MySQL
猫眼
电影
可视化
系统
设计与实现...
Flask框架是一种轻量级的Web应用框架,易于使用和扩展,
MySQL
是一种常用的关系型数据库,Layui是一种易于使用...
赞
踩
article
python
Flask 编写 api 接口,
CORS
解决
flask
跨域问题_
flask
-co...
为什么要编写 API 接口
flask
本身就是一个web框架,完全可以通过内嵌的方式使用
python
flask
框架完成...
赞
踩
article
Flask
入门
1
...
Flask
本身相当于一个内核,其他几乎所有的功能都要用到扩展,都需要用第三方的扩展来实现。
Flask
没有默认使用的数据库...
赞
踩
article
layui
-
vue
+
Flask
实现
Table
排序显示...
在编写使用 Vue +
layui
的中后台系统时,table页面通常是必不可少的。要在 Vue 中实现基于某一列的排序...
赞
踩
article
Flask
跨域
问题
解决方案
_
flask
解决
跨域
...
然而,在某些情况下,我们可能需要允许
跨域
请求,例如通过 JavaScript 发起的 AJAX 请求或在前端应用程序中调...
赞
踩
article
【
flask
】
Flask
解决
跨域
的
问题
_
flask
跨域
...
跨域
文件上传的时候,浏览器会自动发起一个 OPTIONS 方法到服务器,现在后台解决前端
跨域
解决前端
跨域
请求的
问题
客户端...
赞
踩
article
Flask
--
跨域
_
flask
开
跨域
...
这里写自定义目录标题
跨域
配置
跨域
配置方法一: 设置CORS策略from
flask
import
Flask
, rend...
赞
踩
article
Flask
跨域
问题...
一、什么是
跨域
跨域
是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务...
赞
踩
article
Flask
中的
跨域
难题:
定义
、影响与
解决方案
深度解析_
flask
支持
跨域
...
跨域
(Cross-Origin)是指在浏览器中,一个页面的脚本试图访问另一个页面的内容时发生的安全限制。
Flask
作为...
赞
踩
article
flask
跨域
请求...
Flask中,
跨域
请求主要有两种方式:1、在响应头信息中添加允许
跨域
如下,使用装饰器app.after_reques...
赞
踩
article
flask
——
post
请求
无法访问
页面
_
flask
接受不到
post
...
一、问题描述代码#
post
测试@app.route('/
post
Test', methods=['
post
']) de...
赞
踩
article
Vue
+
Flask
跨域
问题解决_
flask
+vue解决
跨域
问题...
跨域
请求是指在浏览器中,通过 AJAX 或 Fetch API 发起的 HTTP 请求,其目标地址与当前页面的域名或端口...
赞
踩
相关标签
flask
python
vue.js
前端
ajax跨域问题
Access-Control
javascript
ecmascript
前端框架
ajax
django
fastapi
信息可视化
数据分析
数据挖掘
网络爬虫