Flask+requests发起页面请求示例

2020-09-23 22:39:18 浏览数 (1)

本文主要记录通过flask requests发起请求的示例,包括:

1、发起get请求

2、发起post请求

3、发起可选请求

1、Flask和Requests怎么一起发送get请求?

1.1 flask访问url的时候,会执行路径下对应的方法。

  • 示例:访问百度
代码语言:txt复制
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训练营】

0 人点赞