在这个例子中,`<name>`是一个变量,它将从URL中获取。所以,如果你访问`http://localhost:5000/greet/John`,它将返回`Hello, John!`。
### 请求方法
在 Flask 中,我们可以通过在路由装饰器中添加 methods 参数来指定 HTTP 请求方法。默认情况下,Flask 的路由只会响应 GET 请求,但我们可以通过 methods 参数来指定路由应该响应的 HTTP 方法,例如 GET、POST、PUT、DELETE 等。
HTTP协议中的GET和POST是两种基本的请求方法,主要区别在于数据传输的方式和用途不同。
1. **数据传输方式**:GET请求的数据会附加在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接。POST方法是把提交的数据放置在是HTTP包的包体中。
2. **数据大小**:由于GET方法的数据是放在HTTP头中的,因此受到HTTP协议的限制,数据不能太大,一般不能大于2KB。POST方法没有限制,理论上数据的大小可以达到无限大。
3. **数据安全性**:POST的数据因为在包体中,所以有一定的安全性。而GET将所有数据放在URL中,用户输入的数据都在URL中明文显示,所以安全性较低。
4. **用途**:GET方法一般用于获取/查询资源信息,而POST方法一般用于更新资源信息。
以下是一个示例,展示了如何在 Flask 中处理 POST 请求:
@app.route(‘/login’, methods=[‘POST’])
def login():
if request.method == ‘POST’:
user = request.form[‘username’]
return ‘Hello, %s!’ % user
在这个示例中,我们首先定义了一个新的路由 ‘/login’,并通过 methods 参数指定这个路由只接受 POST 请求。然后在路由关联的函数中,我们检查了请求方法是否为 POST(尽管在这个例子中可能不需要,因为我们已经指定了这个路由只接受 POST 请求)。如果请求方法为 POST,我们就从表单数据中获取用户名,并返回一个问候消息。
@app.route(‘/data’, methods=[‘GET’, ‘POST’])
def data():
if request.method == ‘POST’:
# POST请求通常用于提交表单数据
# 数据在请求体中,不会显示在URL中
data = request.form[‘data’]
return ‘Received the data: %s’ % data
else:
# GET请求通常用于获取数据
# 请求的数据显示在URL中
return ‘This is a GET request’
在这个例子中,`/data`路由可以同时处理GET和POST请求。如果请求方法是POST,我们从表单数据中获取数据,并返回接收到的数据。如果请求方法是GET(也就是说,不是POST),我们返回一个表示这是GET请求的消息。这个例子清楚地展示了POST和GET请求的主要区别:POST请求通常用于提交数据,数据在请求体中,不会显示在URL中;而GET请求通常用于获取数据,请求的数据显示在URL中。
### 路由变量规则
在 Flask 中,我们可以在路由规则中使用变量部分。特定部分的 URL 可以标记为 <variable\_name>,它将作为关键字参数传递到函数。例如,以下代码创建了一个名为 `user` 的路由变量:
@app.route(‘/user/’)
def show_user_profile(username):
# 用户名将作为字符串传递给 show_user_profile
return ‘User %s’ % username
在这个例子中,当用户访问如 `http://localhost:5000/user/John` 的 URL 时,`show_user_profile` 函数将被调用,且其参数 `username` 的值将会是 `John`。
你也可以使用类型转换器在变量规则中指定变量的类型,例如 `int`、`float`、`path` 等。以下是一些例子:
* `int`:接受整数
@app.route(‘/post/int:post\_id’)
def show_post(post_id):
# post_id 将会是整数类型
return ‘Post %d’ % post_id
* `float`:接受浮点数
@app.route(‘/price/float:price’)
def show_price(price):
# price 将会是浮点数类型
return ‘Price: %f’ % price
* `path`:和默认的字符串类似,但也接受斜线
@app.route(‘/path/path:subpath’)
def show_subpath(subpath):
# subpath 将会是字符串类型,可以包含斜线
return ‘Subpath %s’ % subpath
这样,我们就可以在 Flask 中灵活地处理各种类型的 URL 了。
在Flask的路由变量规则中,`string`和`path`都可以接收字符串类型的变量。但是,两者的主要区别在于,`string`不能接收包含斜线(/)的字符串,而`path`可以。这意味着,如果你在URL中需要传递包含斜线的字符串,应当使用`path`类型。
#### 自定义转换器
除了 Flask 提供的内建转换器,我们还可以自定义转换器,以满足特定的 URL 规则需求。
自定义转换器需要继承自 `werkzeug.routing.BaseConverter` 类,并实现至少两个方法:`to_python` 和 `to_url`。
* `to_python` 方法用于将 URL 中的字符串转换为 Python 对象;
* `to_url` 方法用于将 Python 对象转换回字符串。
以下是一个自定义转换器的例子,它接受三个字母的字符串:
from werkzeug.routing import BaseConverter
class ThreeLetterConverter(BaseConverter):
def to_python(self, value):
if len(value) != 3:
raise ValueError(‘Must be three letters.’)
return value
def to\_url(self, value):
if len(value) != 3:
raise ValueError('Must be three letters.')
return value
app.url_map.converters[‘three’] = ThreeLetterConverter
在这个例子中,我们首先从 `werkzeug.routing` 导入了 `BaseConverter` 类,然后创建了一个新的转换器类 `ThreeLetterConverter`,该类继承自 `BaseConverter`。在 `ThreeLetterConverter` 类中,我们实现了 `to_python` 和 `to_url` 方法,这两个方法都要求输入的值必须是三个字母的字符串。
最后,我们将新的转换器添加到 Flask 应用的 URL 映射转换器字典中,键是转换器的名字(在这个例子中是 ‘three’),值是转换器类。
现在,我们就可以在路由规则中使用新的转换器了:
@app.route(‘/three:code’)
def three_letter_code(code):
return ‘Three-letter code: %s’ % code
在这个路由规则中,`<three:code>` 表示 `code` 必须是一个三个字母的字符串。如果 `code` 不符合这个条件,Flask 将会返回一个 404 错误。
通过自定义转换器,我们可以更灵活地处理各种复杂的 URL 规则。
#### 常用自定义转换器用法示例
自定义转换器可以满足更复杂的URL规则需求,比如我们需要处理的URL中包含了日期信息,格式为`yyyy-mm-dd`,我们就可以自定义一个日期转换器。
from werkzeug.routing import BaseConverter
from datetime import datetime
class DateConverter(BaseConverter):
def to_python(self, value):
return datetime.strptime(value, ‘%Y-%m-%d’)
def to\_url(self, value):
return value.strftime('%Y-%m-%d')
app.url_map.converters[‘date’] = DateConverter
在这个例子中,我们定义了一个名为`DateConverter`的转换器,该转换器将URL中的字符串转换为`datetime`对象,反过来,将`datetime`对象转换为字符串。然后,我们将这个转换器添加到Flask应用的URL映射转换器字典中。
现在,我们就可以在路由规则中使用这个新的转换器:
@app.route(‘/date:start\_date’)
def start_date(start_date):
return ‘Start date: %s’ % start_date
在这个路由规则中,`<date:start_date>`表示`start_date`必须是一个符合`yyyy-mm-dd`格式的日期字符串。如果`start_date`不符合这个条件,Flask将会返回一个404错误。使用这种方式,我们可以方便的处理URL中包含日期等复杂数据的情况。
### 网页渲染
Flask使用模板引擎来生成HTML,这个过程叫做网页渲染。Flask默认使用的模板引擎是Jinja2。
首先,我们需要在Flask应用的目录下创建一个名为templates的文件夹,在这个文件夹中,我们可以放置所有的HTML模板文件。
然后,我们可以使用`render_template`函数来渲染模板。`render_template`函数的第一个参数是模板的文件名(相对于templates文件夹的路径),后面的参数都是传递给模板的变量。
以下是一个例子:
from flask import Flask, render_template
app = Flask(name)
@app.route(‘/hello/’)
def hello(name):
return render_template(‘hello.html’, name=name)
在这个例子中,我们在`/hello/<name>`路由中使用了`render_template`函数来渲染一个名为`hello.html`的模板,并向模板传递了一个名为`name`的变量。
在`hello.html`模板中,我们可以使用`{{ name }}`来获取并显示这个变量的值。例如:
Hello, {{ name }}!
在这个模板中,`{{ name }}`会被替换为传递给模板的`name`变量的值。
通过这种方式,我们可以动态地生成HTML页面,根据不同的数据显示不同的内容。
### 表单渲染
在 Flask 中,我们常常需要处理用户提交的表单数据。这通常包括两个步骤:渲染表单和处理表单数据。
首先,我们需要在模板中创建一个表单。例如,我们可以在 HTML 模板中创建一个简单的登录表单:
在这个表单中,我们有两个输入框分别用于输入用户名和密码,以及一个提交按钮。`method="POST"`表示这个表单会通过 POST 请求提交数据。
然后,我们可以在 Flask 路由中使用 `request.form` 来获取表单数据。例如:
@app.route(‘/login’, methods=[‘POST’])
def login():
username = request.form[‘username’]
password = request.form[‘password’]
# 处理用户名和密码…
return ‘登录成功’
在这个路由中,我们首先通过 `request.form` 获取了用户名和密码,然后进行了一些处理(例如,验证用户名和密码是否正确),最后返回了一个消息。
除了手动创建表单和处理表单数据,我们也可以使用 Flask-WTF 扩展来简化这个过程。Flask-WTF 提供了一种简单的方式来处理表单数据和表单验证。
首先,我们需要定义一个表单类,这个类继承自 `flask_wtf.FlaskForm`,并定义了表单的字段:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
username = StringField(‘用户名’, validators=[DataRequired()])
password = PasswordField(‘密码’, validators=[DataRequired()])
submit = SubmitField(‘登录’)
然后,我们可以在路由中创建一个表单实例,并使用 `render_template` 函数将表单渲染到模板中:
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
# 处理用户名和密码…
return ‘登录成功’
return render_template(‘login.html’, form=form)
最后,我们可以在模板中使用 `form` 变量来渲染表单:
{{ form.hidden_tag() }} {{ form.username.label }} {{ form.username() }} {{ form.password.label }} {{ form.password() }} {{ form.submit() }}
在这个模板中,`form.hidden_tag()` 用于生成一个隐藏的 CSRF 令牌,这对于防止跨站请求伪造攻击是必要的。`form.username.label` 和 `form.username()` 分别用于生成用户名字段的标签和输入框,其他字段类似。
通过这种方式,我们可以更方便地处理表单数据和表单验证,而不需要手动处理每个表单字段。
#### POST请求页面渲染示例:
在Flask中,处理POST请求常见的场景是用户填写表单并提交数据,例如用户登录的场景。以下是一个用户登录的例子,包含了处理POST请求和页面渲染:
from flask import Flask, render_template, request
app = Flask(name)
@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
username = request.form[‘username’]
password = request.form[‘password’]
# 在此处处理用户名和密码,例如查看是否匹配、记录登录状态等
# …
return render_template(‘welcome.html’, username=username) # 渲染欢迎页面
else:
return render_template(‘login.html’) # 渲染登录页面
在这个例子中,当用户首次访问登录页面时,因为是GET请求,所以会渲染并返回’login.html’页面。当用户填写完表单点击提交后,会发送POST请求,此时读取表单中的’username’和’password’,处理后再渲染并返回’welcome.html’页面。
#### GET请求页面渲染示例:
在Flask中,处理GET请求常见的场景是用户请求查看一些信息,例如用户查看个人资料的页面。以下是一个用户查看个人资料的例子:
from flask import Flask, render_template
app = Flask(name)
@app.route(‘/profile/’, methods=[‘GET’])
def profile(username):
# 在此处获取用户资料,例如从数据库中获取
# …
user_profile = get_user_profile(username) # 假设是一个获取用户资料的函数
return render_template(‘profile.html’, profile=user_profile) # 渲染个人资料页面
在这个例子中,当用户访问个人资料页面时,例如’/profile/john’,会发送GET请求,服务器会根据用户名’john’获取相应的用户资料,然后渲染并返回’profile.html’页面,页面中会展示用户的资料。
后端代码示例:
from flask import Flask, render_template
app = Flask(name)
@app.route(‘/info/’, methods=[‘GET’])
def info(id):
# 在此处获取页面信息,例如从数据库中获取
# …
page_info = get_page_info(id) # 假设是一个获取页面信息的函数
return render_template(‘info.html’, info=page_info) # 渲染页面信息
HTML代码示例:
{{ info.title }}
{{ info.content }}
在这个HTML代码示例中,`{{ info.title }}`和`{{ info.content }}`会被替换为传递给模板的`info`对象的`title`和`content`属性的值。
前端HTML代码:
后端Flask代码:
from flask import Flask, request
app = Flask(name)
@app.route(‘/submit’, methods=[‘POST’])
def submit():
username = request.form[‘username’]
password = request.form[‘password’]
# 在此处处理用户名和密码,例如验证用户名和密码,记录登录状态等
# …
return ‘表单提交成功,用户名:%s,密码:%s’ % (username, password)
### 重定向
在 Flask 中,我们可以使用 `redirect()` 函数来重定向用户到另一个端点。`redirect()` 函数的参数是新的 URL。
重定向通常用于用户提交表单或执行操作后,让用户返回到另一个页面。例如,用户登录后,我们可以将用户重定向到主页。
以下是一个重定向的例子:
from flask import Flask, redirect, url_for
app = Flask(name)
@app.route(‘/’)
def index():
return redirect(url_for(‘login’))
@app.route(‘/login’)
def login():
return ‘This is the login page.’
在这个例子中,当用户访问首页(‘/’)时,他们会被重定向到登录页面。
`url_for()` 函数用于生成一个 URL,它接受端点名称(函数名)作为参数。在这个例子中,`url_for('login')` 会生成 ‘/login’。
我们也可以给 `url_for()` 函数传递更多的参数来生成更复杂的 URL。例如,`url_for('user', name='John')` 会生成 ‘/user/John’。
重定向是一个非常有用的功能,我们可以用它来引导用户完成特定的工作流程,或者在用户完成某些操作后将他们引导到不同的页面。
`url_for()`函数用于生成URL,其参数是端点名称(通常是视图函数名)。我们可以使用这个函数生成URL,然后通过`redirect()`函数来重定向到这个URL。
例如,我们有一个名为`profile`的视图,该视图接受一个参数`username`:
@app.route(‘/user/’)
def profile(username):
pass
我们可以使用`url_for()`函数生成这个视图的URL:
url_for(‘profile’, username=‘John’) # 输出:‘/user/John’
然后,我们可以使用`redirect()`函数将用户重定向到这个URL:
from flask import redirect, url_for
@app.route(‘/login’)
def login():
# 用户登录成功后,重定向到他们的个人资料页面
return redirect(url_for(‘profile’, username=‘John’))
在这个例子中,当用户访问`/login`并成功登录后,他们会被重定向到`/user/John`。
我们还可以给`url_for()`函数传递更多的参数来生成更复杂的URL。这些参数将被转化为URL中的查询参数。例如:
url_for(‘search’, q=‘flask tutorial’) # 输出:‘/search?q=flask+tutorial’
使用`url_for()`和`redirect()`函数,我们可以方便地在Flask应用中进行URL重定向。
`make_response()`函数在Flask中用于生成HTTP响应。您可以使用它来创建自定义的HTTP响应,包括设置HTTP头部信息、设置cookie等。
以下是一些`make_response()`的用法示例:
1. 创建带有自定义状态码和头部信息的HTTP响应:
from flask import Flask, make_response
app = Flask(name)
@app.route(‘/’)
def index():
response = make_response(‘
This document carries a cookie!
’)response.set_cookie(‘answer’, ‘42’)
return response
在这个示例中,`make_response()`函数创建了一个新的HTTP响应,包含一个HTML文本。然后,我们使用`set_cookie`方法在响应中设置了一个cookie。
2. 创建带有自定义状态码的HTTP响应:
from flask import Flask, make_response
app = Flask(name)
@app.route(‘/’)
def index():
response = make_response(‘
Resource not found!
’, 404)return response
在这个示例中,`make_response()`函数创建了一个新的HTTP响应,包含一个HTML文本和一个自定义的状态码404。
通过`make_response()`函数,我们可以灵活地创建各种自定义的HTTP响应。
在 Flask 中,我们可以使用 `jsonify()` 函数将字典或者列表转换为 JSON 格式,并返回给前端。以下是一个例子:
from flask import Flask, jsonify
app = Flask(name)
@app.route(‘/api/data’)
def get_data():
data = {‘name’: ‘John’, ‘age’: 30, ‘city’: ‘New York’}
return jsonify(data)
在这个例子中,我们定义了一个名为 `/api/data` 的 API 路由。当前端访问这个路由时,服务器会返回一个 JSON 数据。前端可以使用 AJAX 或者其他方法来获取并处理这个数据。
`jsonify()` 函数在内部使用了 `json.dumps()` 函数将 Python 对象转换为 JSON 格式。它还设置了 HTTP 响应的 MIME 类型为 `application/json`,这样前端就知道返回的数据是 JSON 格式。
注意:`jsonify()` 函数不能直接处理复杂的 Python 对象,例如自定义类的实例。如果你需要将这些对象转换为 JSON,你需要先将它们转换为可以序列化的基本数据类型,例如字典或者列表。
当然,以下是一个完整的 Flask 应用示例,它定义了一个 API 路由来返回 JSON 数据,并将 `JSON_AS_ASCII` 配置项设置为 `False`:
from flask import Flask, jsonify
app = Flask(name)
app.config[‘JSON_AS_ASCII’] = False # 设置 JSON_AS_ASCII 为 False
@app.route(‘/api/data’)
def get_data():
data = {‘name’: ‘张三’, ‘age’: 30, ‘city’: ‘北京’}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)
此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-ggKeG2vG-1712468383299)]
[外链图片转存中…(img-ZilYB1ev-1712468383300)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)