初始化flask项目
😎Hello朋友你好!我是一名西安电子科技大学在校学生,🍉目前主要在做web方向,前端居多,别的方向也有尝试。
如果对博客内容有疑问,或者有想法,🎉欢迎私信或评论,看到一定会回复、尽力为大家解决问题!
如果你对web感兴趣,也欢迎👏一起交流讨论,比如学习路线、项目经验、技术点等等。
同时我会不定期写一些学习心得🦀、技术教程、项目教学等博客,希望能丰富大家的👉技术视野。
技术不易,我们,继续努力👏!
前面的python环境之类的就不说了。
该博客是看 Flask 入门 这个视频教程写的笔记,如果你想入门一下Flask,可以看看这个课,虽然简短,但是入门部分讲的很好,同时可以利用这篇博客复习复习。如果你想了解一下Flask、回顾基础知识点,也可以看一看本篇博客。
文章目录
一、安装flask
只需要使用pip下载即可:
pip install flask
自动下载最新版
二、Hello World
编辑器使用的是pycharm
1. 首先创建一个项目:
关于环境,非常建议选择“先前配置的解释器”,如果选择上面的Virtualenv
,会新创建一个局部的虚拟环境,那么全局安装的模块在这里是用不了的,必须要重新下载,而有些模块是很多项目都可以共用的,不必要这样。
将目录修改成这样,这是一个标准的flask初始化目录。
如果没有文件夹,新建;初始化入口叫main.py
,可以修改成app.py
2. 最简单的flask代码
在app.py
中写:
# 导入flask
from flask import Flask
# 使用flask类创建一个app对象
# __name__: 代表当前app.py这个模块
# 1. 以后出现bug可以通过这个快速定位
# 2. 对于寻找模块文件,可提供一个相对路径
app = Flask(__name__)
# 创建一个路由和视图函数的映射
@app.route('/')
def hello_world():
return "hello world"
# 如果当前模块作为入口
if __name__ == '__main__':
# 跑flask
app.run()
三、一些项目设置
1. debug模式
- 开始debug模式的话,修改代码之后,会自动检测代码的更改并且重新加载,不需要手动停止程序并重启
- 开发的时候出现bug,会在浏览器上输出错误信息
2. 修改host
项目默认运行在127.0.0.1:5000
,如果想要局域网中的人可以访问该项目,可以修改host为0.0.0.0
,之后局域网中的设备就可以通过你的电脑在局域网中的ip进行访问,可以通过设置修改。
3. 修改port端口号
项目默认是监听5000端口号,如果端口被占用之类的需要修改,可以通过设置修改。
路由
对接口地址的请求是通过路由来实现不同服务的:
http://localhost:5000/home => 首页
http://localhost:5000/user => 用户中心
http://localhost:5000/block/data => 博客数据中心
这里说的是基础,高级的路由功能后面再说。
一、配置路由
根据不同的路由配置对应的响应函数:
@app.route('/home')
def home():
return "This is home"
二、传参
可以这样传参
/blog/123456
那么在代码中这样管理123456
这样的参数:
@app.route("/blog/<blog_id>")
def getID(blog_id):
return "访问的博客ID是" + blog_id
还可以规定参数类型
@app.route('/blog/<int:blog_id>')
这样就是规定参数必须是整型
还可以这样传参
/blog?id=123456
那么代码中需要这样拿到参数:
from flask import Flask, request
...
@app.route('/blog')
def getid():
# request.args: 类字典类型,存放`?`之后的参数
# "id" 就是参数的名字
return "获取到博客id为" + request.args.get("id", defalut=1, type=int)
模板渲染
可以在服务器上配置好需要渲染的html页面,当访问到对应路径时进行服务端渲染。
一、基础
首先需要建立这样的目录:
app.py
是项目入口,同级建立一个目录templates
,名字固定,不可更改。
在引入Flask
的时候同时引入render_template
这个函数。
app.py
:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello():
return render_template("test.html")
if __name__ == '__main__':
app.run(debug=True)
test.heml
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板渲染</title>
</head>
<body>
<h1>Hello Flask</h1>
</body>
</html>
当请求到达的时候,根据路径,发现根路径/
返回一个模板渲染函数render_template
,这个函数将自动通过传入的文件名,在templates
这个目录中寻找对应的文件作为模板进行返回渲染。
二、传参
在渲染html页面的时候还可以进行传参:
@app.route('/')
def renderTemplate():
return render_template("test.html", username="我是测试用例")
这样在test.html
中就可以通过双括号直接拿到了:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板渲染</title>
</head>
<body>
<h1>username: {{ username }}</h1>
</body>
</html>
Flask 连接 MySQL 数据库
可以使用一些封装库去连接,接下来将使用:
- pymysql:纯python写的驱动
- Flask-SQLAlchemy:一般不直接写元素SQL语句去执行操作,而是通过SQLAlchemy提供的ORM技术,和操作普通python对象一样实现数据库的增删改查。而Flask-SQLAlchemy是对SQLAlchemy的封装。
一、ORM模型
一个ORM模型中:
- 模型与数据库的表对应
- 模型属性对应表的字段
- 模型的实例对象对应表中的每条记录
二、连接数据库
-
表单类需要继承一个
db.Model
类 -
db.Column
该方法用于将类属性映射成为表单字段 -
db.create_all()
提交所有表单类到数据库
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 数据库配置
HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = ''
DATABASE = 'clflask'
# 将配置信息综合
app.config[
'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
# 在app.config中设置数据库信息
# 使用SQLAlchemy创建一个db对象
# SQLAlchemy会自动读取配置中的数据库信息
db = SQLAlchemy(app)
# 测试连接的代码
# with app.app_context():
# with db.engine.connect() as conn:
# rs = conn.execute("select 1")
# print(rs.fetchone)
# 创建一个User表单,通过定义属性来映射字段
class User(db.Model):
# 表单名
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
with app.app_context():
db.create_all()
@app.route('/')
def demo4():
return "hello world"
if __name__ == '__main__':
app.run(debug=True)
三、增删改查
- 所有操作都不是直接对数据库操作,而是通过
session
,先对缓存进行操作,之后在db.session.commit()
到数据库 - 增:
db.session.add()
- 删:先查询出要删除的数据,再调用
db.session.delete()
,进行删除 - 改:先查询出要修改的数据,在该对象上进行修改即可
- 查:有两种方式进行查找 1.
db.query.get()
, 2.db.query.filter_by()
@app.route('/user/add')
def add_user():
# 创建数据实例
user = User(username='arui', password='123456')
# 添加数据到数据库连接会话
db.session.add(user)
# 提交操作
db.session.commit()
return '用户创建成功'
@app.route('/user/info')
def get_user():
# 1. 根据主键查找,一次只能查找一个
# user = User.query.get(1)
# 2. 使用filter查找,传入查询条件,返回一个类数组
users = User.query.filter_by(username='arui')
for user in users:
print(user.username)
return "查找成功"
@app.route('/user/update')
def update_user():
# 先查询出需要修改的数据
user = User.query.filter_by(username='arui').first()
user.password = 111111
db.session.commit()
return "修改完成"
@app.route('/user/delete')
def delete_user():
# 先查询出需要删除的数据
user = User.query.filter_by(id=2).first()
# 在会话中删除
db.session.delete(user)
# 提交动态
db.session.commit()
return "删除成功"
四、外键
关系型数据库中,可以在一个数据表里,通过外键链接另一个数据库,而不用把所有东西维护在一个表中。
所以接下来创建一个文章表,使用外键将作者信息和用户信息绑定。
多表联动有点儿难,可以看看第17节课。
class Article(db.Model):
__tablename__ = "Article"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.text, nullable=False)
# 添加作者外键
auther_id = db.Column(db.Integer, db.ForeignKey('user.id'))
# 将作者链接到用户表
auther = db.relationship('User')
# 通过上面两步操作,这样也可以拿到作者信息:article.auther
# 其过程为:因为auther字段已经和外表进行链接,那么这个属性会自动通过外键,在外表中进行查找
article = Article(title="学一学flask", content="学一学flask学一学flask")
五、将类映射到数据库
之前是使用db.create_all()
这个方法去将创建好的数据表类映射到数据库,但是这个方法有局限性,即他只能将新增的类同步到数据库,但是对字段的修改无法同步。
所以可以使用flask-migrate
这个库来实现更好的映射。
下载:
pip install flask-migrate
ORM模型映射成表的步骤:
-
代码:
from flask_migrate import Migrate ... migrate = Migrate(app, db)
-
flask db init
:只许执行一次,命令行下当前项目目录中执行 -
flask db migrate
:识别ORM模型的改变,生成迁移脚本 -
flask db upgrade
:运行迁移脚本,同步到数据库