【问题标题】:Programmatically perform a nested GET request in Django在 Django 中以编程方式执行嵌套的 GET 请求
【发布时间】:2011-05-02 02:48:00
【问题描述】:

在 Django 中处理请求期间,我需要对同一个应用程序执行嵌套请求。考虑这个例子,在处理 sendmail 请求时,我尝试向同一服务器发出另一个请求以获取附件的内容(邮件的正文和要附加的内容的 url 列表提供给 sendmail 视图函数通过POST参数):

def sendmail(request):
    mail = #... create a mail object
    for url in urls: # iterate over desired attachments urls
        data = urllib.urlopen('http://127.0.0.1:8000' + url).read()
        mail.attach(data)

这种方法存在几个问题。首先,它不适用于开发服务器,因为它一次只能处理一个请求:因为它已经在处理 sendmail 请求,所以尝试从给定的 url 读取将永远阻塞。 其次,我要指定服务器的ip和端口,这不是很好。

我想做类似的事情:

data = django_get(url).read()

假设的 django_get 方法不会真正发出 http 请求,而是直接调用 django 组件,该组件接受一个 url 并返回一个 HttpResponse。这将解决这两个问题,因为没有任何实际的套接字连接,也没有必要在 url 中包含服务器/端口。怎么可能实现?

【问题讨论】:

    标签: django


    【解决方案1】:

    reverse() 的反义词是resolve()

    另外,this

    【讨论】:

      【解决方案2】:

      这是 Ignacio Vazquez-Abrams 对懒人的回答:

      from django.core.urlresolvers import resolve
      
      def sendmail(request):
          mail = #... create a mail object
          for url in urls: # iterate over desired attachments urls
              resolved = resolve(url)
              request.path = url
              mail.attach(resolved.func(request, *resolved.args, **resolved.kwargs))
      

      【讨论】:

        【解决方案3】:

        将所需的功能放在一个单独的函数中,您的 sendmail 函数和原始页面的函数都可以调用。

        【讨论】:

        • 这意味着我必须在我的 sendmail 函数中解析 url 以确定要调用哪个函数,这是 django 在解析 url 时已经完成的工作......我认为 Ignacio 的答案就是我正在寻找的为。
        • @gpothier URL的动态部分不是函数的参数吗?
        猜你喜欢
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多