搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
数据结构灵魂
这个屌丝很懒,什么也没留下!
关注作者
热门标签
article
热门文章
1
.Net微服务负载均衡1_net高并发处理方案
2
springboot依赖注入的三种方式
3
解决QT中无边框窗口播放视频时调用showMinimized最小化恢复后冻结窗口_qt5最小化窗口恢复后要一点按钮才有反应
4
printf格式控制(你所不知道的printf妙用)_printf语句格式控制后面可以是
5
服务治理中间件-Eureka
6
显示隐藏会根据长短变化的tooltip组件(自用留档)_el-tooltip根据内容显示隐藏
7
2024年跨年倒计时代码祝福!_2024年跨年代码
8
机器学习 vs 深度学习:了解两者的异同_机器学习 深度学习
9
flume的安装与配置_flume安装步骤
10
优化VMware虚拟机里的MacOS系统_vm装macos不流畅
当前位置:
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/blog/article/detail/51648
推荐阅读
article
【
Vue
】【
Python
】【
Flask
】
Vue
连接
Python
Flask
后端跨域
问题
,以及GET能用
POST
不能用_
python
flask
后端接口如何避免跨域
问题
Vue
项目如果连接Pyhton后端通常会存在跨域的
问题
,最开始我是用nginx解决的,后来发现
flask
有一个
flask
_cors包,比较简便。后来又出现
POST
请求不能用的
问题
。_
python
flask
后端接口如何避免跨域
问题
python
...
[详细]
赞
踩
article
Flask
框架解决
跨域
问题
_
python
flask
接口
允许
跨域
访问
flask
dbmigrate#生成迁移文件。
flask
dbupgrade#执行迁移文件。#创建同步数据库的对象。
_
python
flask
接口
允许
跨域
访问
python
flask
接口
允许
跨域
访问行笔之前、请
允许
我写一段毕生箴言:历史总是要前进的...
[详细]
赞
踩
article
Flask
No
Access
-
Control
-
Allow
-
Origin
跨域
问题_
flask
不允许
跨域
访问
如果不是浏览器请求python-
flask
接口的同学,不用往下看了原因:一般自己写的项目,前后端都是存放在同一个域名下的。也就是部署到同一个tomcat上。那样就不存在
跨域
问题但是!!!我在桌面写了个index.html,通过ajax访问我...
[详细]
赞
踩
article
Python
+
Vue
+
Flask
,
打造让面试官
眼前一亮
的
在线视频
网站
近期ChatGPT非常火爆
,
它宣告着人工智能更上一个台阶
,
人工智能主要的开发语言就是
Python
。然而
,
如果单纯学习
Python
语言
,
是无法让我们直接提升技术能力。很多技术想要吃透
,
必须在应用过程中深刻体会
,
才能知道“背后的门道”。而开发一...
[详细]
赞
踩
article
Python-Flask-
ajax
-接口无响应/跨域问题-(
strict
-
origin
-
when
-
cross
-
origin
)_
flask
strict
-
origin
-
when
-
cross
-
origin
起因/目的抽空写前端JQuery时,配合用到python的
flask
框架形式接口给前端对接-当发现前端调用和接口根本就没问题,为什么请求时就无响应呢,后面了解到是跨域问题,详看下图。问题图复制下面代码可使用#跨域defallow_
cross
...
[详细]
赞
踩
article
20210724-
flask
-跨域调用问题-
blocked
by CORS
policy
_
python
flask
has been
blocked
by
cors
policy
问题背景:
flask
服务启动后,用westorm的项目去访问
flask
的服务接口,提示‘。。。hasbeen
blocked
byCORS
policy
。。。’,这个是因为服务器没有开启允许跨域请求(还没有完全明白同一个网络为什么就跨域了。。。。...
[详细]
赞
踩
article
python
开发-
Flask
与
Vue
基础_
python
flask
vue
dev_
python
flask
vue
python
flask
vue
本文记录了从零开始入门
flask
与
vue
开发。后端接受API并返回数据。返回的数据可以从数据库中查询修改前端构建和展示页面,一些交互通过ajax等库向后端发送API请求,然后对...
[详细]
赞
踩
article
Django
、
Flask
与 Javascirpt 之间传值与
数据
转换
本文介绍了,在python中dict,json类型定义与区别,
转换
方法,在javascript中object与json类型定义与区别、
转换
方法。
Django
,
Flask
传递
数据
库记录时常用的格式,以及在javascript中如何通过json...
[详细]
赞
踩
article
基于
Python
flask
MySQL
猫眼
电影
可视化
系统
设计与实现
Flask框架是一种轻量级的Web应用框架,易于使用和扩展,
MySQL
是一种常用的关系型数据库,Layui是一种易于使用的前端UI框架,Echart是一种常用的
可视化
库,requests库是
Python
中常用的网络请求库。最后,在数据分析环...
[详细]
赞
踩
article
python
Flask 编写 api 接口,
CORS
解决
flask
跨域问题_
flask
-
cors
python
3
import
的名称
为什么要编写API接口
flask
本身就是一个web框架,完全可以通过内嵌的方式使用
python
flask
框架完成web页面的开发。因为现在都讲究一个前后端分离,那为什么要前后端分离呢,且听我慢慢道来。对于前后端分离的应用场景,不是所有的场景...
[详细]
赞
踩
article
Flask
入门
1
Flask
本身相当于一个内核,其他几乎所有的功能都要用到扩展,都需要用第三方的扩展来实现。
Flask
没有默认使用的数据库、窗体验证工具。你可以选择MySQL,也可以用NoSQL。
Flask
诞生于20
1
0年,ArminRonacher的一个愚...
[详细]
赞
踩
article
layui
-
vue
+
Flask
实现
Table
排序显示
在编写使用Vue+
layui
的中后台系统时,table页面通常是必不可少的。要在Vue中实现基于某一列的排序,我们需要更新columns数组中相应列的定义,以便包含排序的逻辑。,我们需要在后端设置一个能够接收排序参数并根据这些参数返回排序后...
[详细]
赞
踩
article
Flask
跨域
问题
解决方案
_
flask
解决
跨域
然而,在某些情况下,我们可能需要允许
跨域
请求,例如通过JavaScript发起的AJAX请求或在前端应用程序中调用后端API。为了解决
Flask
的
跨域
问题,我们可以使用
Flask
-CORS扩展。
Flask
-CORS提供了一种简单的方式来处理...
[详细]
赞
踩
article
【
flask
】
Flask
解决
跨域
的
问题
_
flask
跨域
跨域
文件上传的时候,浏览器会自动发起一个OPTIONS方法到服务器,现在后台解决前端
跨域
解决前端
跨域
请求的
问题
客户端发起的这个OPTIONS可以说是一个“预请求”,用于探测后续真正需要发起的
跨域
POST请求对于服务器来说是否是安全可接受的,...
[详细]
赞
踩
article
Flask
--
跨域
_
flask
开
跨域
这里写自定义目录标题
跨域
配置
跨域
配置方法一:设置CORS策略from
flask
import
Flask
,render_templatefrom
flask
_corsimportCORSapp=
Flask
(__name__)#配置
跨域
:suppo...
[详细]
赞
踩
article
Flask
跨域
问题
一、什么是
跨域
跨域
是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源。同源策略是指:浏览器A从服务器B获取的静...
[详细]
赞
踩
article
Flask
中的
跨域
难题:
定义
、影响与
解决方案
深度解析_
flask
支持
跨域
跨域
(Cross-Origin)是指在浏览器中,一个页面的脚本试图访问另一个页面的内容时发生的安全限制。
Flask
作为一种Web应用框架,也涉及到
跨域
问题。本文将详细介绍
跨域
的
定义
、影响以及
解决方案
,涵盖如何在
Flask
中处理
跨域
问题。_f...
[详细]
赞
踩
article
flask
跨域
请求
Flask中,
跨域
请求主要有两种方式:1、在响应头信息中添加允许
跨域
如下,使用装饰器app.after_request(我这里的web是定义的蓝图),这样在每次请求后,加入header 2、使用第三方插件
flask
-cors 参考官...
[详细]
赞
踩
article
flask
——
post
请求
无法访问
页面
_
flask
接受不到
post
一、问题描述代码#
post
测试@app.route('/
post
Test',methods=['
post
'])def
post
Test():return"567"出错:MethodNotAllowedThemethodisnotallowed...
[详细]
赞
踩
article
Vue
+
Flask
跨域
问题解决_
flask
+vue解决
跨域
问题
跨域
请求是指在浏览器中,通过AJAX或FetchAPI发起的HTTP请求,其目标地址与当前页面的域名或端口不一致。由于浏览器的同源策略限制,
跨域
请求默认是被禁止的。至此,您已经学会了如何在
Vue
.js和
Flask
中解决
跨域
请求的问题。希望本...
[详细]
赞
踩
相关标签
flask
python
vue.js
前端
ajax跨域问题
Access-Control
javascript
ecmascript
前端框架
ajax
django
fastapi
信息可视化
数据分析
数据挖掘
网络爬虫