Flask学习笔记


在这个例子中,`<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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-ggKeG2vG-1712468383299)]

[外链图片转存中…(img-ZilYB1ev-1712468383300)]

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)

img
  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一款非常流行的嵌入式微控制器系列,它具有强大的性能和丰富的外设资源。在学习STM32时,掌握如何进行Flash读写是非常重要的。 Flash是一种非易失性存储器,可以用来存储程序代码和数据。在STM32中,Flash存储器通常用来存储应用程序代码。下面是一个简单的Flash读写程序的示例: 1.首先,我们需要包含适用于所使用的STM32型号的头文件。例如,对于STM32F4系列,我们需要包含"stm32f4xx.h"。 2.然后,我们需要定义一个指向Flash存储器的指针变量。例如,可以使用如下代码:`uint32_t* flash_address = (uint32_t*)0x08000000;`其中0x08000000是Flash存储器的起始地址。 3.要读取Flash存储器中的数据,我们可以通过以下代码实现:`data = *flash_address;`其中data是一个变量,用于存储读取到的数据。 4.要写入数据到Flash存储器中,我们可以通过以下代码实现:`*flash_address = data;`其中data是要写入的数据。 需要注意的是,STM32的Flash存储器是有写保护机制的,因此在写入数据之前,我们需要禁用写保护。可以使用以下代码禁用写保护:`FLASH->KEYR = 0x45670123; FLASH->KEYR = 0xCDEF89AB;`然后才能进行数据写入。 另外,为了确保数据的完整性,我们可以使用CRC校验来验证Flash存储器中的程序代码的正确性。可以使用库函数来计算校验和,然后将其与预期的校验和进行比较以进行验证。 综上所述,掌握STM32的Flash读写操作对于嵌入式系统的开发非常重要。上述示例代码可以帮助我们快速进行Flash读写操作,同时注意写保护和数据校验可以提高数据的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值