pythonform提交表单
❶ 如何用python requests post一段字符串
一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样:
请求行
请求报头
消息主体
HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:
application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。application/json
以json串提交数据。multipart/form-data
一般使用来上传文件。- url = 'htt.org/post'd = {'key1': 'value1', 'key2': 'value2'}
- r = requests.post(url, data=d)
- print r.text12341234
- url = 'httin.org/post's = json.mps({'key1': 'value1', 'key2': 'value2'})
- r = requests.post(url, data=s)
- print r.text12341234
- url = 'htt.org/post'files = {'file': open('report.txt', 'rb')}
- r = requests.post(url, files=files)
- print r.text12341234
2.7.1 以form形式发送post请求
Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。
输出:
{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“key1”: “value1”,
“key2”: “value2”
},
“headers”: {
……
“Content-Type”: “application/x-www-form-urlencoded”,
……
},
“json”: null,
……
}
可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。
2.7.2 以json形式发送post请求
可以将一json串传给requests.post()的data参数,
输出:
{
“args”: {},
“data”: “{”key2”: ”value2”, ”key1”: ”value1”}”,
“files”: {},
“form”: {},
“headers”: {
……
“Content-Type”: “application/json”,
……
},
“json”: {
“key1”: “value1”,
“key2”: “value2”
},
……
}
可以看到,请求头的Content-Type设置为application/json,并将s这个json串提交到服务端中。
2.7.3 以multipart形式发送post请求
Requests也支持以multipart形式发送post请求,只需将一文件传给requests.post()的files参数即可。
输出:
{
“args”: {},
“data”: “”,
“files”: {
“file”: “Hello world!”
},
“form”: {},
“headers”: {……
“Content-Type”: “multipart/form-data; boundary=”,
……
},
“json”: null,
……
}
文本文件report.txt的内容只有一行:Hello world!,从请求的响应结果可以看到数据已上传到服务端中。
❷ Python的Flask框架中web表单
下面为你介绍了Python的Flask框架中判游web表单的教程,表单是学习各个web框架中的基础知识,需要的朋友可以参考下
概要
在前面章节我们为主页定义了一个简单的模板,部分尚未实现的模块如用户或帖子等使用模拟的对象作为临时占位。
本章我们将看到如何利用web表单填补这些空白。
web表单是web应用中最基本的构建要素,我们将通过表单来实现用户发帖和应用登录功能。
完成本章内容你需要基于前面章节完成的微博应用代码,请确认这些代码已安装并能正常运行。
配置
Flask-WTF是WTForms项目的Flask框架扩展,我们将用他来帮助我们处理web表单。
大部分Flask扩展都需要定义相关配置项,所以我们先来在应用根目录下创建一个配置文件以备使用。我们先这样创建 (fileconfig.py):
SRF_ENABLED = True
SECRET_KEY = you-will-never-guess
很简单吧,这是Flask-WTF需要用到的2个配置项。CSRF_ENABLED配置启用了跨站请求攻击保护,大部分情况下你都需要开启此功能,这能使你的应用更安全。
SECRET_KEY设置当CSRF启用时有效,这将生成一个加密的token供表单验证使用,你要确保这个KEY足够复杂不会被简单推测。
现在这个配置文件已经基本可用了。项目创建完成我们可以创建如下文件并编辑(fileapp/__init__.py):
?
from flask import Flask
app = Flask(__name__)
app.config.from_object(config)
from app import views
用户登录表单
使用Flask-WTF创建的表单就像一个对象,需要从Form类继承子类。然后在这个子类中定义一些类的属性变量作为表单字段就可以了。
我们要创建一个登录表单,用来进行用户身份识别。但跟平常需要验证用户名和密码的登录方式不同,我们将使用 OpenId 来处理登录过程。使用OpenId的好处就是我们不用管那些用户名和密码的认证过程,交给 OpenId 去搞定,它会返回给我们用户验证后的数据。这样对于使用我们网站的用户而言也更安全。
使用 OpenId 登录只需要一个字符串,然后发送给 OpenId 服务器就行了。另外我们还需要在表单中加一个“记住我” 的选项框,这个是送给那些不想每次来我们网站都要进行身份认证的人。选择这个选项后,首次登录时会用cookie在他们的浏览器上记住他们的登录信息,下次再进入网站时就不需要进行登录操作。
开始我们的第一个表单吧 (fileapp/forms.py):
?
from flask.ext.wtf import Form, TextField, BooleanField
from flask.ext.wtf import Required
class LoginForm(Form):
openid = TextField(openid, validators = [Required()])
remember_me = BooleanField(remember_me, default = False)
欣赏一下这个类,多么的简洁,多么的一目了然。如此简单,但又十分的富有内涵。我们引入了一个 Form 类,然后继承这个类,按需求还添加了 TextField 和 BooleanField 这两个字段。
另外还引入了一个表单验证函数 Required,这种验证函数可以附加在字段里面,在用户提交表单时它们会用来检查用户填写的数据。这个 Required 函数是用来防止用户提交空数据。Flask-WTF 中还有掘冲碧很多不同作用的表单验证函数,我们将会在后面使用到它们。
表单模板
现在我们的问题就是需要一个显示这个登录表单的模板。好消息是我们刚刚创建的登录表单类知道如何把字段转换成HTML,所以我们只需要把注意力集判举中到页面布局上。下面就是我们的登录表单的模板 (fileapp/templates/login.html):
-- extend from base layout --
{% extends base.html %}
{% block content %}
h1Sign In/h1
form action= method=post name=login
{{form.hidden_tag()}}
p
Please enter your OpenID:br
{{form.openid(size=80)}}br
/p
p{{form.remember_me}} Remember Me/p
pinput type=submit value=Sign In/p
/form
{% endblock %}
容我_嗦一下,在这个模板中,我们又一次使用了模板继承的方式。使用 extends 语句从 base.html 继承模板内容。我们会在后面创建的模板中继续使用这种方式,这样可以使我们所有的页面布局保持一致。
这个登录模板跟普通的HTML表单有些明显的区别,它使用模板参数 {{ ... }} 来实例化表单字段,而表单字段又来源于我们刚刚定义的表单类,模板参数中使用了 form 这个名称。当我们使用视图函数引用表单类并渲染到模板时,我们要特别注意这个把表单类传递到模板的变量名。
我们在配置中开启了CSRF(跨站伪造请求)功能,模板参数 {{ form.hidden_tag() }} 会被替换成一个具有防止CSRF功能的隐藏表单字段。在开启了CSRF功能后,所有模板的表单中都需要添加这个模板参数。
我们定义的表单对象中的字段同样也能被模板渲染,只需要在模板合适的位置添加类似于 {{ form.field_name }} 这样的模板参数,相关字段就会在被定义的位置出现。另外还有一些字段是可以传参数,比如这个 openid 字段,我们就添加了一个参数让它显示的宽度增加到80个字符。
由于我们没有在表单中定义一个提交功能的按钮,所以在这里只能以普通表单字段的方式来做了。不过说起来区区一个按钮,在表单中跟任何数据都没有关系,的确也没有在表单类中定义的必要。
表单视图
见证奇迹的时刻最后一步,我们马上要来写一个渲染登录表单对象到模板的视图函数。
这个函数相当的简单无趣,因为我们只需要把表单对象传递给模板就行了。下面就是我们这个视图函数的全部内容 (fileapp/views.py):
11
12
from flask import render_template, flash, redirect
from app import app
from forms import LoginForm
# index view function suppressed for brevity
@app.route(/login, methods = [GET, POST])
def login():
form = LoginForm()
return render_template(login.html,
title = Sign In,
form = form)
我们引入登录表单类,然后把它实例化到一个变量,最后再把这个变量传给模板。要渲染表单字段必须的事情也就这些。
上面的代码中还引入了两个新对象: falsh 和 redirect, 这个先甭理它们,稍后才用得上。
另外还做了一件事就是在路由装饰器中添加一个新方法。让 Flask 明白我们这个视图函数支持 GET 和 POST 请求。否则这个视图函数只会响应 GET 请求。我们需要得到用户填写表单后提交的数据,这些数据是从 POST 请求中传递过来的。
你可以通过在浏览器中测试这个程序来了解上面所说的。 按照视图函数关联的路由,你应该在浏览器中输入
由于我们还没有写任何接收数据的代码,所以现在你在页面中点提交按钮还没有任何效果。
从表单中接收数据
另外值得一提的是, Flask-WTF 对表单提交数据的处理使我们的接下来要做的事情变得简单了。下面就是我们这个登录视图函数的新版本, 加入了表单数据验证和处理 (fileapp/views.py):
?
7
8
9
@app.route(/login, methods = [GET, POST])
def login():
form = LoginForm()
if form.validate_on_submit():
flash(Login requested for OpenID= + form.openid.data + , remember_me= + str(form.remember_me.data))
return redirect(/index)
return render_template(login.html,
title = Sign In,
form = form)
validate_on_submit() 这个方法做了表单处理的所有工作。如果你在表单向用户提供数据时(举个栗子:用户在它之前修改了一下提交的数据) 时调用此方法,它会返回 False。发生这样的情况时,你懂的。不懂?就是提交的数据验证不通过,你要继续渲染模板。
在提交请求时调用了表单的 validate_on_submit() 方法后,它会从请求中获取所有提交的数据,然后使用表单字段中绑定的验证函数进行数据验证。在所有的数据都验证通过时会返回 True. 这就意味着你可以放心的使用这些表单数据了。
只要有一个字段验证不通过,它都会返回 False. 这时就需要我们返回数据给用户,让他们来纠正一下错误数据。接下来我们将会看到在数据验证失败时,如何把错误消息显示给用户。
当 validate_on_submit() 方法返回 True 的时候,我们的视图函数又会调用两个新的函数。它们都是从Flask 中引入的,flash 函数用来在下一个打开的页面中显示定义的消息。我们现在用它用来做调试。因为我们现在还没有做用户登录模块, 所以只需要把用户提交上来的数据显示一下就行了。flash 函数非常有用,比如为用户的一些操作提供消息反馈。
flash 函数提供的消息不会自动出现在我们的网站页面中,所以我们需要做点事情让它在页面中显示出来。为了让我们所有页面都能有这项激动人心的功能,所以就把它添加到基础模板中吧, 下面是更新后的基础模板 (fileapp/templates/base.html):
html
head
{% if title %}
title{{title}} - microblog/title
{% else %}
titlemicroblog/title
{% endif %}
/head
body
divMicroblog: a href=/indexHome/a/div
hr
{% with messages = get_flashed_messages() %}
{% if messages %}
ul
{% for message in messages %}
li{{ message }} /li
{% endfor %}
/ul
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
/body
/html
模板中显示 flash 消息的功能希望你能明白。
在视图函数中我们使用的另一个新函数就是 redirect. 这个函数会通知用户的浏览器跳转到指定的地址。在我们的视图函数中,我们使用它跳转到了首页。注意跳转结束后页面上还会显示 flash 函数传递的消息哦。
激动人心的时刻到了,运行我们的程序吧,看看表单是如何工作的吧。不要填写表单中的 openid 字段,看看 Required 这个验证函数是如何发挥威力,把一切发起空数据的请求阻止在千里之外。
改善一下字段验证
我们程序目前状况不错,提交不合要求的数据会被阻止,还会返回表单让用户修改,基本满足我们要求。
但似乎还少点什么。如果我们在用户提交数据失败后给用户点提示,让他们知道什么原因引起的,岂不妙哉!太幸运了,用 Flask-WTF 可以轻松解决这个问题。
当表单字段验证失败时, Flask-WTF 会添加一个错误消息到表单对象。这些消息在模板中也是可以使用的,所以我们只需要在模板中添加一点点东西就OK了。
这个就是我们添加了验证消息的登录模板 (fileapp/templates/login.html):
16
17
18
!-- extend base layout --
{% extends base.html %}
{% block content %}
h1Sign In/h1
form action= method=post name=login
{{form.hidden_tag()}}
p
Please enter your OpenID:br
{{form.openid(size=80)}}br
{% for error in form.errors.openid %}
span style=color: red;[{{error}}]/span
{% endfor %}br
/p
p{{form.remember_me}} Remember Me/p
pinput type=submit value=Sign In/p
/form
{% endblock %}
我们仅在 openid 字段的右边添加了一个循环语句,它会把openid字段验证失败的消息都显示出来。不论你的表单有多少字段,所有表单字段验证失败的错误消息都可以用 form.errors.字段名 这种方式来使用。这个表单中我们的是 form.errors.openid。为了让错误消息引起用户的注意,我们还给消息添加了显示红色的 css 样式。
处理 OpenID 登录
现实生活中,我们发现有很多人都不知道他们拥有一些公共账号。一部分大牌的网站或服务商都会为他们的会员提供公共账号的认证。举个栗子,如果你有一个 google 账号,其实你就有了一个公共账号,类似的还有 Yahoo, AOL, Flickr 等。
为了方便我们的用户能简单的使用他们的公共账号,我们将把这些公共账号的链接添加到一个列表,这样用户就不用自手工输入了。
我们要把一些提供给用户的公共账号服务商定义到一个列表里面,这个列表就放到配置文件中吧 (fileconfig.py):
?
7
8
9
CSRF_ENABLED = True
SECRET_KEY = you-will-never-guess
OPENID_PROVIDERS = [
{ name: Google, url:
{ name: Yahoo, url:
{ name: AOL, url:
{ name: Flickr, url:
{ name: MyOpenID, url:
}]
接下来就是要在我们的登录视图函数中使用这个列表了:
@app.route(/login, methods = [GET, POST])
def login():
form = LoginForm()
if form.validate_on_submit():
flash(Login requested for OpenID= + form.openid.data + , remember_me= + str(form.remember_me.data))
return redirect(/index)
return render_template(login.html,
title = Sign In,
form = form,
providers = app.config[OPENID_PROVIDERS])
我们从 app.config 中引入了公共账号服务商的配置列表,然后把它作为一个参数通过 render_template 函数引入到模板。
接下来要做的我想你也猜得到,我们需要在登录模板中把这些服务商链接显示出来。
24
25
26
27
28
29
30
31
32
33
34
!-- extend base layout --
{% extends base.html %}
{% block content %}
script type=text/javascript
function set_openid(openid, pr)
{
u = openid.search(username)
if (u != -1) {
// openid requires username
user = prompt(Enter your
+ pr +
username:)
openid = openid.substr(0, u) + user
}
form = document.forms[login];
form.elements[openid].value = openid
}
/script
h1Sign In/h1
form action= method=post name=login
{{form.hidden_tag()}}
p
Please enter your OpenID, or select one of the providers below:br
{{form.openid(size=80)}}
{% for error in form.errors.openid %}
span style=color: red;[{{error}}]/span
{% endfor %}br
|{% for pr in providers %}
a href=javascript:set_openid({{pr.url}}, {{pr.name}});{{pr.name}}/a |
{% endfor %}
/p
p{{form.remember_me}} Remember Me/p
pinput type=submit value=Sign In/p
/form
{% endblock %}
这次的模板添加的东西似乎有点多。一些公共账号需要提供用户名,为了解决这个我们用了点 javascript。当用户点击相关的公共账号链接时,需要用户名的公共账号会提示用户输入用户名, javascript 会把用户名处理成可用的公共账号,最后再插入到 openid 字段的文本框中。
下面这个是在登录页面点击 google 链接后显示的截图:
❸ 怎么用python抓取网页并实现一些提交操作
首先我们找到登录的元素,在输入账号处选中–>右键–>检查
然后直接查询网页源代码去找到上面的部分,根据标签来观察提交的表单参数,这里强调一下:
form标签和form标签下的input标签非常重要,form标签中的action属性代表请求的URL,input标签下的name属性代表提交参数的KEY。
代码参考如下:
import requests
url="网址" #action属性
params={
"source":"index_nav", #input标签下的name
"form_email":"xxxxxx", #input标签下的name
"form_password":"xxxxxx" #input标签下的name
}
html=requests.post(url,data=params)
print(html.text)
运行后发现已登录账号,相当于一个提交登陆的操作
❹ python http requests 怎么实现模拟登录,提交表单
以下实例是一个完整的代码,实现了从博客获取内容发布至网络,分别实践抓取博客内容、模拟登录、表单提交这几步;
#注意,以下程序是一个完全程序,如果只需要实现模拟登录,提交表单,删除抓取部分即可,相关的代码已经清楚标注,可以根据自己实际情况修改。
代码如下:
# -*- coding: utf-8 -*-
import re
import urllib
import urllib2
import cookielib
#第一步,获取博客标题和正文 ,“IP”可以改为实际地址;
url = "IP"
sock = urllib.urlopen(url)
html = sock.read()
sock.close()
content = re.findall('(?<=blogstory">).*(?=<p class="right artical)', html, re.S)
content = re.findall('<script.*>.*</script>(.*)', content[0], re.S)
title = re.findall('(?<=<title>)(.*)-.* - CSDN.*(?=</title>)', html, re.S)
#根据文章获取内容新建表单值
blog = {'spBlogTitle': title[0].decode('utf-8').encode('gbk'), #文章标题
'spBlogText': content[0].decode('utf-8').encode('gbk'),#文章内容
'ct': "1",
'cm': "1"}
del content
del title
#第二步,模拟登录网络;
cj = cookielib.CookieJar()
#登陆网络的用户名和密码
post_data = urllib.urlencode({'username': '[username]', 'password': '[password]', 'pwd': '1'})
#登录地址路径
path = 'https://passport..com/?login'
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', 'Opera/9.23')]
urllib2.install_opener(opener)
req = urllib2.Request(path, post_data)
conn = urllib2.urlopen(req)
#获取网络登陆认证令牌
bd = urllib2.urlopen(urllib2.Request('http://hi..com/[username]/creat/blog')).read()
bd = re.findall('(?<=bdstoken\" value=\").*(?=ct)', bd, re.S)
blog['bdstoken'] = bd[0][:32]
#设置分类名
blog['spBlogCatName'] = 'php'
#第四步,比较表单,提交表单;req2 = urllib2.Request('http://hi..com/[username]/commit', urllib.urlencode(blog))
#最后,查看表单提交后返回内容,检验;
print urllib2.urlopen(req2).read()
#注意:将[username]/[password]替换为自己真实用户名和密码
❺ 用python flask制作的网页上传到服务器后python如何获取网上用户提交的form表单信息
from flask import request
request.args 是get方法的form内容
request.form 是post方法的form内容
❻ 用python复制form表单的问题
首先,你需要使用Python的requests库来实现这个功能,它可以帮助你发送POST请求。
第一步:使用requests库发送POST请求,获取form表单信息:
import requests
url = 'http://www.example.com/form'
data = {'name': 'John', 'age': '30'}
r = requests.post(url, data=data)
form_data = r.text
第二步:将form表单信息复制到另一个网店:
url = 'http://www.anothersite.com/form'
r = requests.post(url, data=form_data)