为什么 Python 请求库没有得到响应?

Why Python requests library failing to get response?

我有一个查看方法:

# This view method is to register a new user through api call
def register(request):
    if request.method == 'GET':
        registrationForm = RegistrationForm(request.GET)

        if registrationForm.is_valid():

            r = requests.get('http://localhost:8000/api/create-user/', timeout=10)
            print r.content
            return HttpResponseRedirect('/')
    else:
        registrationForm = RegistrationForm()

    return render(request, 'frontend/index.html', {'registrationForm': registrationForm})

这里在上面提到的视图方法中,请求库一直在加载,只是没有得到响应,最终在 10 秒后超时失败。

'api/create-user/' url 映射到的另一个应用程序在同一个项目中,这可能是原因吗?

该应用 urls.py(不是主要 urls.py)中映射的 url 是:

from django.conf.urls import include, url
from django.contrib import admin

from . import views

urlpatterns = [
    url(r'^create-user/', views.create_user),
]

我也在使用Django rest framework,上面提到的url匹配的视图是:

from django.shortcuts import render

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response


# Create your views here.
@api_view(['GET'])
def create_user(request):
    print 'coming....'
    # print request.GET.get('username')
    # print request.POST.get('password')
    data = {}

    data.update({'result': 'good'})

    return Response(data)

通过单元测试它工作正常,这是我写的单元测试:

from django.test import TestCase

import requests

# Create your tests here.
# This class is for unit testing the request/response for api module.
# Here we can test if the REST api call we are making are working perfect or not.
class FrontEndTests(TestCase):

    def test_user_creation(self):
        r = requests.get('http://localhost:8000/api/create-user/')
        print r.content
        self.assertIsNotNone(r, "Not none")

我还在 settings.py 中添加了一些设置,例如 ALLOWED_HOSTS 等,对于 django rest 框架,我添加了:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.AllowAny',
    ]
}

SESSION_SAVE_EVERY_REQUEST = True

ALLOWED_HOSTS = ['localhost', '127.0.0.1']

我在这里做错了什么? 谢谢


我也尝试过使用来自 manage.py shell 的请求,它似乎在那里工作正常。 是因为我在 form.is_valid() 块中使用它,它不起作用,还是我也怀疑 django-rest-framework 是罪魁祸首。有没有我需要添加更多的设置?

------------ 回答


我使用的是非多线程的 runserver_plus,为了解决这个问题,我使用的是 runserver,它工作正常,否则你必须在两个不同的端口上启动同一个项目!

我相信这是因为您使用的是非多线程的 Django 运行服务器(如果我错了请纠正我)

https://code.djangoproject.com/ticket/3357

因此您对 localhost:8000 的请求正在排队等待发出请求的请求完成!不理想。

在生产环境中,如果您使用 wsgi 应用程序(如 uwsgi)运行连接您的服务器,这没问题,因为它 多线程的。

它在这个测试用例中起作用的原因是因为您正在从测试线程向测试服务器发出请求 在另一个线程中 运行 .

编辑 #1:需要考虑的几件事

1) 为什么您接受 GET 请求中的注册表单而不是 POST 请求?这是对 GET 动词的滥用,因为您实际上是在服务器上创建一些东西

2) 为什么要从应用程序内部调用自己的 API 而不是将此功能放入可以从所有需要它的端点调用的方法中?

编辑#2:

如评论中所述,开发服务器多线程

https://github.com/django/django/commit/ce165f7bbf