为什么Python请求库无法获得响应?

时间:2016-08-16 16:16:28

标签: django python-2.7 django-rest-framework python-requests django-1.8

我有一个查看方法:

# 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秒后失败作为timedout。

其他应用,其中' api / create-user /' url映射到同一项目中,这可能是原因吗?

该app urls.py(不是主urls.py)中该映射的网址是:

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框架,上面提到的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 framework:

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,它工作正常,否则你必须在两个不同的端口上启动同一个项目!

1 个答案:

答案 0 :(得分:3)

我相信这是因为你使用的是Django runserver(如果我错了,请纠正我),这不是多线程的

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

所以你请求localhost:8000排队等待请求完成的请求!不理想。

在生产中,使用wsgi app(如uwsgi)运行服务器时,这样就可以了,因为 是多线程的。

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

编辑#1:要考虑的一些事情

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

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

编辑#2:

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

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