本文主要记录通过flask requests发起请求的示例,包括:
1、发起get请求
2、发起post请求
3、发起可选请求
1、Flask和Requests怎么一起发送get请求?
1.1 flask访问url的时候,会执行路径下对应的方法。
- 示例:访问百度
from flask import Flask
import requests
app = Flask(__name__)
url = 'http://www.baidu.com'
@app.route('/get')
def get():
r = requests.get(url)
r.encoding = 'utf-8'
return r.text
app.run(debug=True)
- 结果:
1.2 在页面上展示一个接口的断言结果
代码语言:txt复制__author__ = 'catleer'
from flask import Flask
import requests
app = Flask(__name__)
url = 'http://www.baidu.com'
def get_assert():
r = requests.get(url)
if r.status_code == 200:
return True
else:
return False
@app.route('/get')
def get():
if get_assert():
return '通过'
else:
return '失败'
app.run(debug=True)
结果:
- 将url变为其他具有反爬机制的url,会发现结果是失败,因为页面有反爬虫机制,不允许使用这种方式访问。对于这种情况,要记录失败的原因。在测试内部web页面的时候,要注意考虑这种情况。
- 将url变为非法的url,会直接导致服务报错,所以当接口地址非法时,需要有异常处理机制
1.3 对get请求进行基本的异常处理
代码语言:txt复制import re
from flask import Flask
import requests
app = Flask(__name__)
url1 = 'https://www.jianshu.com/u/39cef8a56bf9'
url = 'http://www'
def get_assert(url):
# 判断url是否合法,需要了解url的构成,用正则匹配进行判断
# url的构成:协议、域名、端口、虚拟目录、文件名、参数部分等 其中:协议、域名是必须存在的
# 协议为:http或https 域名为:xxx.xxxx.xxx 端口为:数字
if not re.match(r'^https?://[^s]*.[^s]*.[com|cn|net].*', url):
return 'URL不合法,无法执行接口用例'
r = requests.get(url)
r.encoding = 'utf-8'
if r.status_code == 200:
return True
else:
return r.text
@app.route('/get')
def get():
if get_assert(url) == True:
return '通过'
else:
return '失败' ',' '失败原因:' get_assert(url)
结果:
2、通过flask发送post请求
2.1 flask和requests怎么发送post请求呢?
以登录禅道系统为例,传入post的参数包括url和data,data为json格式,包括:token、用户名、密码等,需要与实际接口传入的参数一致。
代码语言:javascript复制"""
Created by catleer on 2018-06-08.
"""
__author__ = 'catleer'
import re
from flask import Flask
import requests
app = Flask(__name__)
url1 = 'https://www.jianshu.com/u/39cef8a56bf9'
url = 'http://139.99.152.146:8080/zentao/user-login.html'
data = {'authenticity_token': ' gy/zbvCNJATHwvygafFlOOR4gF5dl3bzheFlArNlN3IvlSuURRTZYbFZ5wTAdIwWl TaykOF lXbwQXWYkodg==',
'user[email]': '123456789@qq.com',
'user[password]': '123456789',
'user[remember_me]': '0',
'commit': '登录'}
def post_assert(url, data):
# 判断url是否合法,需要了解url的构成,用正则匹配进行判断
# url的构成:协议、域名、端口、虚拟目录、文件名、参数部分等 其中:协议、域名是必须存在的
# 协议为:http或https 域名为:xxx.xxxx.xxx 端口为:数字
if not re.match(r'^https?://[^s]*.[^s]*.[com|cn|net].*', url):
return 'URL不合法,无法执行接口用例'
r = requests.post(url, data=data)
r.encoding = 'utf-8'
if r.status_code == 200:
return True
else:
return r.text
@app.route('/post')
def get():
if post_assert(url, data) == True:
return '通过'
else:
return '失败' ',' '失败原因:' post_assert(url, data)
app.run(debug=True)
代码语言:javascript复制import re
from flask import Flask
import requests
app = Flask(__name__)
url1 = 'https://www.jianshu.com/u/39cef8a56bf9'
url = 'http://httpbin.org/anything'
data = {'a': 'hi'}
def post_assert(url, data):
# 判断url是否合法,需要了解url的构成,用正则匹配进行判断
# url的构成:协议、域名、端口、虚拟目录、文件名、参数部分等 其中:协议、域名是必须存在的
# 协议为:http或https 域名为:xxx.xxxx.xxx 端口为:数字
if not re.match(r'^https?://[^s]*.[com|cn|net|org].*', url):
return 'URL不合法,无法执行接口用例'
r = requests.post(url, data=data)
r.encoding = 'utf-8'
if r.status_code == 200:
return True
else:
return r.text
@app.route('/post')
def get():
if post_assert(url, data) == True:
return '通过'
else:
return '失败' ',' '失败原因:' post_assert(url, data)
app.run(debug=True)
3、通过Flask发送请求,请求可选
3.1 Flask发送请求
前面看到,可以通过flask发送get或post请求,那么怎么通过Flask发送任意类型的请求呢,怎么把这些集成在一个方法中?
通过自定义一个request方法,将get或post作为参数传入。
代码语言:javascript复制import re
from flask import Flask
import requests
from requests import Request, Session
app = Flask(__name__)
url1 = 'https://www.jianshu.com/u/39cef8a56bf9'
url = 'http://httpbin.org/anything'
data = {'a': 'hi'}
def try_request(method, url, data,
header={}, stream=True, verify=False,
proxies={}, cert=None, timeout=100):
if not re.match(r'^https?://[^s]*.[com|cn|net|org].*', url):
return 'URL不合法,无法执行接口用例'
s = Session()
method = method.upper()
req = Request(method, url,
data=data,
headers=header
)
prepped = req.prepare()
resp = s.send(prepped,
stream=stream,
verify=verify,
proxies=proxies,
cert=cert,
timeout=timeout
)
resp.encoding = 'utf-8'
if resp.status_code == 200:
return True
else:
return resp.text
# method = 'get'
@app.route('/requests/<method>')
def get(method):
if try_request(method, url, data) == True:
return '<h1>请求方法, %s!请求结果:通过</h1>' % method
else:
return '失败' ',' '失败原因:' try_request(method, url, data)
app.run(debug=True)
查看显示结果:
【技术创作101训练营】