问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

request.form.get总是返回默认值

发布网友 发布时间:2023-02-09 22:49

我来回答

2个回答

热心网友 时间:2023-10-16 17:25

简介二、安装三、从 Hello World 开始3.1 Hello World3.2 修改Flask的配置3.3 调试模式3.4 绑定IP和端口3.5 本节源码四、获取 URL 参数4.1 建立Flask项目4.2 列出所有的url参数4.3 获取某个指定的参数4.4 如何处理多值4.5 本节源码五、获取POST方法传送的数据5.1 建立Flask项目5.2 查看POST数据内容5.3 解析POST数据5.4 本节源码六、处理和响应JSON数据6.1 建立Flask项目6.2 处理JSON格式的请求数据6.3 响应JSON-方案16.4 响应JSON-方案26.5 本节源码七、上传文件7.1 建立Flask项目7.2 上传文件7.3 本节源码八、Restful URL8.1 建立Flask项目8.2 编写代码8.3 转换类型8.4 一个有趣的用法8.5 编写转换器8.6 本节源码九、使用url_for生成链接9.1 建立Flask项目9.2 编写代码9.3 本节源码十、使用redirect重定向网址10.1 建立Flask项目10.2 编写代码10.3 本节源码十一、使用Jinja2模板引擎11.1 建立Flask项目11.2 创建并编辑HelloWorld/templates/default.html11.4 编辑HelloWorld/server.py11.5 运行与测试11.6 本节源码十二、自定义404等错误的响应12.1 示例1:简单入门12.2 示例2:自定义错误页面12.3 本节源码十三、用户会话13.1 建立Flask项目13.2 编辑HelloWorld/server.py13.3 代码的含义13.4 效果13.5 设置sessin的有效时间13.6 本节源码十四、使用Cookie14.1 建立Flask项目14.2 代码14.3 运行与测试14.4 本节源码十五、闪存系统 flashing system15.1 建立Flask项目15.2 编写HelloWorld/server.py15.3 效果15.4 高级用法15.5 在模板文件中获取flash的内容15.6 本节源码
一、简介
Flask是一个轻量级的基于Python的web框架。

本文适合有一定HTML、Python、网络基础的同学阅读。

这份文档中的代码使用>建议在 linux 下实践本教程中命令行操作、执行代码。

二、安装
通过pip3安装Flask即可:

$ sudo pip3 install Flask
进入python交互模式看下Flask的介绍和版本:

$ python3

>>> import flask
>>> print(flask.__doc__)

flask
~~~~~

A microframework based on Werkzeug. It's extensively documented
and follows best practice patterns.

:copyright: © 2010 by the Pallets team.
:license: BSD, see LICENSE for more details.

>>> print(flask.__version__)
1.0.2
三、从>
本节主要内容:使用Flask写一个显示”Hello World!”的web程序,如何配置、调试Flask。

3.1>
按照以下命令建立Flask项目HelloWorld:

mkdir HelloWorld
mkdir HelloWorld/static
mkdir HelloWorld/templates
touch HelloWorld/server.py
static和templates目录是默认配置,其中static用来存放静态资源,例如图片、js、css文件等。templates存放模板文件。
我们的网站逻辑基本在server.py文件中,当然,也可以给这个文件起其他的名字。

在server.py中加入以下内容:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == '__main__':
app.run()
运行server.py:

$ python3 server.py
* Running on http://127.0.0.1:5000/
打开浏览器访问http://127.0.0.1:5000/,浏览页面上将出现Hello World!。
终端里会显示下面的信息:

127.0.0.1 - - [16/May/2014 10:29:08] "GET / HTTP/1.1" 200 -
变量app是一个Flask实例,通过下面的方式:

@app.route('/')
def hello_world():
return 'Hello World!'
当客户端访问/时,将响应hello_world()函数返回的内容。注意,这不是返回Hello World!这么简单,Hello World!只是HTTP响应报文的实体部分,状态码等信息既可以由Flask自动处理,也可以通过编程来制定。

3.2>
app = Flask(__name__)
上面的代码中,python内置变量__name__的值是字符串__main__ 。Flask类将这个参数作为程序名称。当然这个是可以自定义的,比如app = Flask("my-app")。

Flask默认使用static目录存放静态资源,templates目录存放模板,这是可以通过设置参数更改的:

app = Flask("my-app", static_folder="path1", template_folder="path2")
更多参数请参考__doc__:

from flask import Flask
print(Flask.__doc__)
3.3>
上面的server.py中以app.run()方式运行,这种方式下,如果服务器端出现错误是不会在客户端显示的。但是在开发环境中,显示错误信息是很有必要的,要显示错误信息,应该以下面的方式运行Flask:

app.run(debug=True)
将debug设置为True的另一个好处是,程序启动后,会自动检测源码是否发生变化,若有变化则自动重启程序。这可以帮我们省下很多时间。

3.4>
默认情况下,Flask绑定IP为127.0.0.1,端口为5000。我们也可以通过下面的方式自定义:

app.run(host='0.0.0.0', port=80, debug=True)
0.0.0.0代表电脑所有的IP。80是HTTP网站服务的默认端口。什么是默认?比如,我们访问网站http://www.example.com,其实是访问的http://www.example.com:80,只不过:80可以省略不写。

由于绑定了80端口,需要使用root权限运行server.py。也就是:

$ sudo python3 server.py
3.5>
https://github.com/letiantian/Learn-Flask/tree/master/flask-demo-001

四、获取>
URL参数是出现在url中的键值对,例如http://127.0.0.1:5000/?disp=3中的url参数是{'disp':3}。

4.1>
按照以下命令建立Flask项目HelloWorld:

mkdir HelloWorld
mkdir HelloWorld/static
mkdir HelloWorld/templates
touch HelloWorld/server.py
4.2>
在server.py中添加以下内容:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
return request.args.__str__()

if __name__ == '__main__':
app.run(port=5000, debug=True)
在浏览器中访问http://127.0.0.1:5000/?user=Flask&time&p=7&p=8,将显示:

ImmutableMultiDict([('user', 'Flask'), ('time', ''), ('p', '7'), ('p', '8')])
较新的浏览器也支持直接在url中输入中文(最新的火狐浏览器内部会帮忙将中文转换成符合URL规范的数据),在浏览器中访问http://127.0.0.1:5000/?info=这是爱,,将显示:

ImmutableMultiDict([('info', '这是爱,')])
浏览器传给我们的Flask服务的数据长什么样子呢?可以通过request.full_path和request.path来看一下:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
print(request.path)
print(request.full_path)
return request.args.__str__()

if __name__ == '__main__':
app.run(port=5000, debug=True)
浏览器访问http://127.0.0.1:5000/?info=这是爱,,运行server.py的终端会输出:
1./

2./?info=%E8%BF%99%E6%98%AF%E7%88%B1%EF%BC%8C

4.3>
例如,要获取键info对应的值,如下修改server.py:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
return request.args.get('info')

if __name__ == '__main__':
app.run(port=5000)
运行server.py,在浏览器中访问http://127.0.0.1:5000/?info=hello,浏览器将显示:

hello
不过,当我们访问http://127.0.0.1:5000/时候却出现了500错误

为什么为这样?

这是因为没有在URL参数中找到info。所以request.args.get('info')返回Python内置的None,而Flask不允许返回None。

解决方法很简单,我们先判断下它是不是None:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
r = request.args.get('info')
if r==None:
# do something
return ''
return r

if __name__ == '__main__':
app.run(port=5000, debug=True)
另外一个方法是,设置默认值,也就是取不到数据时用这个值:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
r = request.args.get('info', 'hi')
return r

if __name__ == '__main__':
app.run(port=5000, debug=True)
函数request.args.get的第二个参数用来设置默认值。此时在浏览器访问http://127.0.0.1:5000/,将显示:

hi
4.4>
还记得上面有一次请求是这样的吗? http://127.0.0.1:5000/?user=Flask&time&p=7&p=8,仔细看下,p有两个值。

如果我们的代码是:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
r = request.args.get('p')
return r

if __name__ == '__main__':
app.run(port=5000, debug=True)
在浏览器中请求时,我们只会看到7。如果我们需要把p的所有值都获取到,该怎么办?

不用get,用getlist:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
r = request.args.getlist('p') # 返回一个list
return str(r)

if __name__ == '__main__':
app.run(port=5000, debug=True)
浏览器输入 http://127.0.0.1:5000/?user=Flask&time&p=7&p=8,我们会看到['7', '8']。

4.5>
https://github.com/letiantian/Learn-Flask/tree/master/flask-demo-002

五、获取POST方法传送的数据
作为一种HTTP请求方法,POST用于向指定的资源提交要被处理的数据。我们在某网站注册用户、写文章等时候,需要将数据传递到网站服务器中。并不适合将数据放到URL参数中,密码放到URL参数中容易被看到,文章数据又太多,浏览器不一定支持太长长度的URL。这时,一般使用POST方法。

本文使用python的requests库模拟浏览器。

安装方法:

$ sudo pip3 install requests
5.1>
按照以下命令建立Flask项目HelloWorld:

mkdir HelloWorld
mkdir HelloWorld/static
mkdir HelloWorld/templates
touch HelloWorld/server.py
5.2>
以用户注册为例子,我们需要向服务器/register传送用户名name和密码password。如下编写HelloWorld/server.py。

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'hello world'

@app.route('/register', methods=['POST'])
def register():
print(request.headers)
print(request.stream.read())
return 'welcome'

if __name__ == '__main__':
app.run(port=5000, debug=True)
`@app.route(‘/register’, methods=[‘POST’])是指url/register只接受POST方法。可以根据需要修改methods`参数,例如如果想要让它同时支持GET和POST,这样写:

@app.route('/register', methods=['GET', 'POST'])
浏览器模拟工具client.py内容如下:

import requests

user_info = {'name': 'letian', 'password': '123'}
r = requests.post("http://127.0.0.1:5000/register", data=user_info)

print(r.text)
运行HelloWorld/server.py,然后运行client.py。client.py将输出:

welcome
而HelloWorld/server.py在终端中输出以下调试信息(通过print输出):

Host: 127.0.0.1:5000
User-Agent: python-requests/2.19.1
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive
Content-Length: 24
Content-Type: application/x-www-form-urlencoded

b'name=letian&password=123'
前6行是client.py生成的HTTP请求头,由print(request.headers)输出。

请求体的数据,我们通过print(request.stream.read())输出,结果是:

b'name=letian&password=123'
5.3>
上面,我们看到post的数据内容是:

b'name=letian&password=123'
我们要想办法把我们要的name、password提取出来,怎么做呢?自己写?不用,Flask已经内置了解析器request.form。

我们将服务代码改成:

from flask import Flask, request

热心网友 时间:2023-10-16 17:26

form method属性
form表单默认是get请求的方式,对于想要将form表单中input框输入的内容传递给服务器,我们需要设置form标签 method属性的值为POST(默认为GET)
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我要问一下掇刀医保局恢复正常上班吗? 医保卡是东宝区的怎么才能转到掇刀区 东宝人社局 医保局 空调扇和风扇有什么区别 ...上了技校,现在上了电大的大专,档案在自己手里怎么办? 高职扩招的档案从哪里来 专科没有毕业档案怎么办 技校没上完考上专科,档案怎么转 凉薯和红薯有什么区别 凉薯和山药一样吗 我是一名教师 评职称发表论文 不知道网上哪些机构好点 具体? 测小灯泡电功率 测量小灯泡电功率 eatlessfastfood为什么用less less是比较级吗 特约suning是什么 自己的做得网站如何和后台系统连接 戚风蛋糕蛋白打嫩了会怎么样 简单的舞蹈怎么跳 微信红包给手机充值话费需要多久才能到账 双开门冰箱,电热器,净水器仨一天能用多少度电? 1.2一度空调热水器冰箱6天多少度电 一个冰箱,一个电热水器,24小时开着一个月多少度 三个电器一个冰箱一个热水器多少电 vivo手机不支持应用怎么办 vk视频声音不支持怎么办 自己家网站的后台操作怎么进啊? 华为平板发货为啥这么快 慕贝尔是世界500强吗 慕贝尔汽车部件太仓有限公司怎么样? 单位工程竣工验收方案的解析? 大自然的动物写一段话 好段:关于“动物”的精彩描写_3000字 动物描写作文600字 如何提高产品的销售量? 美国手机怎么注册? 梦见朋友生死胎是什么预兆? 梦见别人生孩子死了是什么意思 MIUI系统带的那个手电筒软件,在哪可以单独下载? 梦见水井打水是什么预兆? 锦瑟无端五十弦,表达了作者什么感情? 锦瑟无端五十弦是表达什么感情的诗句 锦瑟无端五十弦,一弦一柱思华年。表达了作者什么样的思想感情? 如何理解《锦瑟》中“锦瑟无端五十弦,一弦一柱思华年”这句话?_百度知... 微信视频号怎么设置视频号? 长袖针织衫配针织裙,青春活力,又有女人味,你喜欢这样穿搭吗?_百度... 员工出车祸后公司怎样处理 乌鲁木到九泉走高速多少公里 从乌鲁木齐到马鬃山不经过星星峡吗? 床头上挂什么画最吉祥风水好 挂什么画最旺财? 关于校园安全的诗句