为了账号安全,请及时绑定邮箱和手机立即绑定

使用请求-html 在不启动服务器的情况下测试 Flask 应用

使用请求-html 在不启动服务器的情况下测试 Flask 应用

回首忆惘然 2022-09-27 16:28:55
我一直在使用 Flask 对象来测试我的 Web 应用程序。我使用美丽汤来解析其中一些调用的 HTML 输出。test_client现在我想尝试请求-html,但我不知道如何使它与Flask测试客户端一起工作。这些示例都使用请求包来获取响应,但 Werkzeug 测试客户端不会进行实际的 HTTP 调用。据我所知,它设置了环境,只是调用处理程序方法。有没有办法在不运行实际服务的情况下完成这项工作?
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

请求-wsgi 适配器提供了一个适配器,用于在 URL 上挂载可调用的 WSGI。您可以使用会话.mount() 来挂载适配器,因此对于请求-html,您将改用并挂载到该适配器。HTMLSession

$ pip install flask requests-wsgi-adapter requests-html

from flask import Flask


app = Flask(__name__)


@app.route("/")

def index():

    return "<p>Hello, World!</p>"

from requests_html import HTMLSession

from wsgiadapter import WSGIAdapter


s = HTMLSession()

s.mount("http://test", WSGIAdapter(app))

r = s.get("http://test/")

assert r.html.find("p")[0].text == "Hello, World!"

使用请求的缺点是,您必须在要向其发出请求的每个URL之前添加。Flask 测试客户端不需要这样做。"http://test/"


除了使用请求和请求-html 之外,您还可以告诉 Flask 测试客户端返回一个响应,该响应将为您执行美丽苏美解析。在快速浏览了请求-html之后,我仍然更喜欢直接的烧瓶测试客户端和美丽汤API。


$ pip install flask beautifulsoup4 lxml

from flask.wrappers import Response

from werkzeug.utils import cached_property


class HTMLResponse(Response):

    @cached_property

    def html(self):

        return BeautifulSoup(self.get_data(), "lxml")


app.response_class = HTMLResponse

c = app.test_client()

r = c.get("/")

assert r.html.p.text == "Hello, World!"

您还应该考虑使用 HTTPX 而不是请求。它是一个现代的,维护良好的HTTP客户端库,与请求共享许多API相似之处。它还具有出色的功能,例如异步,HTTP / 2以及直接调用WSGI应用程序的内置功能。


$ pip install flask httpx

c = httpx.Client(app=app, base_url="http://test")

with c:

    r = c.get("/")

    html = BeautifulSoup(r.text)

    assert html.p.text == "Hello, World!"




查看完整回答
反对 回复 2022-09-27
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信