【发布时间】:2016-12-23 02:51:15
【问题描述】:
我有一个视图方法:
# 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框架,上面提到的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,它工作正常,否则你必须在两个不同的端口上启动同一个项目!
【问题讨论】:
-
如果你设置了超时,你的单元测试是否通过?
-
@JuanTomas 是的。我刚刚测试过。
-
请粘贴
requests.get调用超时时的回溯。 -
为什么要通过 API 调用自己的应用程序?重点是什么?为什么不直接调用方法呢?
-
@DanielRoseman 它的原型。
标签: django python-2.7 django-rest-framework python-requests django-1.8