flask开发规范

Hello_world

对于flask框架的开发,一般都是遵循着如下格式模版:

1
2
3
4
5
6
7
8
9
10
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染

app = flask.Flask(__name__) # 创建一个Flask对象

@app.route('/hello')
def hello_func():
return "hello world!"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902223748762

路由规范

  1. 路由定义的路径名称应尽量与其绑定的函数名称应该尽量相同

项目目录

  • 对于一个比较复杂的项目结构,该结构的目录如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
my_flask_app/

├── app/
│ ├── __init__.py
│ ├── routes/ # 路由逻辑
│ │ ├── __init__.py
│ │ ├── main.py
│ │ └── auth.py
│ ├── models/ # 数据库模型
│ │ ├── __init__.py
│ │ └── user.py
│ ├── templates/ # 前端展示相关
│ │ ├── layout.html
│ │ └── home.html
│ └── static/ # 前端展示相关
│ ├── css/
│ └── js/

├── config.py # 配置
├── requirements.txt # 项目依赖
├── migrations/ # 数据库版本管理
│ └── ...
└── run.py # 程序启动文件

flask路由

  • 在flask中路由并不是指网络层的那些东西,而是web应用将URL映射python函数的机制。flask路由是flask应用的核心部分,用于处理不同的URL的请求,并将请求的处理委托给相应的视图函数。
  • 下面是关于Flask路由的详细说明:
    • 定义路由:@app.route("/path")装饰器定义URL和视图函数的映射。
    • 路由参数:通过动态部分在URL中传递参数
    • 路由规则:使用类型转换器指定URL参数传递的类型,字符串、整数、浮点数、路径。
    • 请求方法:指定允许的HTTP请求方法。
    • 路由函数返回:视图函数可以返回不同的类型响应。
    • 静态文件和模版:管理静态文件和动态渲染HTML模版。
    • 路由优先级:确保路由顺序正确,以避免意外匹配结果。

定义路由

路由的定义其实就是如下两步:

  • 第一步先在一行中写上@app.route("/path")
  • 第二步紧接着定义一个函数,这个函数被称为视图函数,例子就用hello_world的这个例子
1
2
3
4
5
6
7
8
9
10
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染

app = flask.Flask(__name__) # 创建一个Flask对象

@app.route('/hello')
def hello_func():
return "hello world!"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

参数接收

  • 在定义路由的时候定义这样的形式:@app.route('/say/<name>'),这就是表示将URL请求的一些路径参数传递给函数,这个name其实是一个变量名称。
  • 当使用URL访问/say/xxx,此时name=xxx就会作为参数传递给其绑定的函数,所以路由绑定的函数就会存在name这个参数,而这个xxx是被用户决定的。
  • 例子:对于如下代码,当我们访问/say/aaaname='aaa',此时就会返回hello aaa;如果访问/say/bbb,此时就会返回hello bbb
1
2
3
4
5
6
7
8
9
10
11
12
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染

app = flask.Flask(__name__) # 创建一个Flask对象


@app.route('/say/<name>')
def say(name):
return f"hello {name}"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902225006459

image-20250902225103185

路由规则

  • 对于参数的接收可以指定一个规则,使得接收的参数为整型会绑定一个函数,接收的参数为字符串类型会绑定另一个函数。这个规则的定义如下:
1
@app.route("/type/<int:number>") # <数据类型:变量名>
  • 例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染

app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/type/<int:number>")
def type1(number):
return f"int,{number}"
@app.route("/type/<string:strs>")
def type2(strs):
return f"str,{strs}"
if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902225722918

image-20250902225735722

请求方法

  • 这里的请求方法指的是http协议的请求方法,常见的http协议的请求方法有:GETPOSTPUTDELETE。这里指简单介绍GET请求和POST请求。

  • 定义的形式如下:选定传入的参数为methodsmethods为一个列表类型,它需要指定为接收的方法类型,比如只处理get请求,就只写['GET'];如果需要处理get、post请求,就需要写['GET','POST']

1
@app.route("/get",methods=["GET"])
  • 例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染

app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/get",methods=["GET"])
def get_func():
return "这是一个get请求"

@app.route("/post",methods=["POST"])
def post_func():
return "这是一个post请求"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902230653213

image-20250902231047893

image-20250902232053306

视图函数返回

视图函数的返回可以返回字符串、html、标签、json文件、自定义请求响应,这里直接从例子入手。

  • 例子1:返回json
1
2
3
4
5
6
7
8
9
10
11
12
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/json")
def json_func():
dicts=dict()
dicts["name"] = "tome"
dicts["age"] = 19
return flask.jsonify(dicts)

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902233706687

  • 例子2:返回字符串
1
2
3
4
5
6
7
8
9
10
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/str")
def str_func():
return "strs"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902233815127

  • 例子3:返回html
1
2
3
4
5
6
7
8
9
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/html")
def html_func():
return "<h1>html</h1>"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902233914436

  • 例子4:返回自定义请求
1
2
3
4
5
6
7
8
9
10
11
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/response")
def response_func():
response=flask.Response("defi response",status=200)
response.headers['name'] = "definiresponse"
return response

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902234501110

静态文件与模版

  • 静态文件和模版:管理静态文件和动态渲染HTML模版。例如:.html、.png、.jpg文件

  • 这个其实也是路由函数的一种返回类型,是直接返回文件。需要使用flask中的flask.render_template()函数,使用flask.render_template(),该函数会从当前目录下的一个名为templates的目录作为根目录去寻找对应的文件。

image-20250902235026791

1
2
3
4
5
6
7
8
9
10
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/return_html")
def return_html_func():
return flask.render_template('./example.html')

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902235038747

路由优先级

  • 当存在两个相同的路由时,使用URL访问路由函数时,到底是先调用哪个路由函数,这个就需要使用路由优先级确定。
  • 路由优先级原则:哪个路由函数先被定义,先被定义的路由函数优先级就会更高。访问该路径的时候,使用的路由函数始终是func1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import flask # 也可以使用 from flask import *,但是这样导入可能会造成函数名称污染
app = flask.Flask(__name__) # 创建一个Flask对象

@app.route("/my_route")
def func1():
return "Func1"

@app.route("/my_route")
def func2():
return "Func2"

if __name__ == '__main__':
app.run() # 还可以app.run("ip",post)

image-20250902235353791

flask视图函数

  • 视图函数其实就是与flask路由绑定起来的函数,该函数被称为视图函数。视图函数一般最经常用来处理前端发送过来的请求,后端的逻辑一般都在flask视图函数中编写。
  • 对于flask视图函数,主要就是前后端交互的处理,一般就是接收和处理前端发送过来的数据,然后将处理结果返回给前端,从而达到前后端交互目的。

获取请求数据

返回响应

处理请求相应

处理错误

视图函数修饰器

flask模版渲染

  • 在web开发中,模版一般是指带有占位符的HTML文件,这样其实就能根据一些用户信息或者用户的请求在前端显示不同的信息。

项目1—登录界面

阶段1

阶段2