django - para - ¿Por qué Python solicita que la biblioteca no obtenga respuesta?
python para dummies español pdf (1)
Tengo un método de vista:
# 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})
Aquí en el método de vista mencionado anteriormente, la biblioteca de solicitudes simplemente continúa cargando y simplemente no obtiene la respuesta y finalmente falla después de 10 segundos como el tiempo de espera excedido.
La otra aplicación donde se asigna la URL ''api / create-user /'' está en el mismo proyecto, ¿podría ser esta la razón?
La url para esa asignación en esa aplicación urls.py (no urls.py principal) es:
from django.conf.urls import include, url
from django.contrib import admin
from . import views
urlpatterns = [
url(r''^create-user/'', views.create_user),
]
También estoy usando el marco de reposo de Django y la vista con la que se compara el url mencionado anteriormente es:
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)
Con la prueba de la unidad funciona bien, aquí está la prueba de unidad que escribí:
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")
También he agregado algunas configuraciones como ALLOWED_HOSTS, etc. en settings.py y para el framework django rest que agregué:
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'']
¿Qué estoy haciendo mal aquí? Gracias
También intenté usar solicitudes del shell manage.py, y parece funcionar bien allí. ¿Es porque lo estoy usando dentro de un bloque form.is_valid () que no está funcionando o también sospecho que django-rest-framework es el culpable? ¿Hay alguna configuración que deba agregar más?
---------- Respuesta
Estaba usando runserver_plus que no es multiproceso, para resolver este problema estoy usando runserver y funciona bien, de lo contrario, debe iniciar el mismo proyecto en dos puertos diferentes.
Creo que esto se debe a que está utilizando el servidor de ejecución Django (corríjanme si estoy equivocado) que no tiene múltiples subprocesos
https://code.djangoproject.com/ticket/3357
¡Entonces solicita a localhost: 8000 está en cola esperando la solicitud que hizo que la solicitud termine! No es ideal.
En producción, donde está ejecutando su servidor con una aplicación wsgi (como uwsgi), esto estaría bien porque es multiproceso.
El motivo por el que funciona en este caso de prueba es porque está realizando la solicitud del subproceso de prueba al servidor de prueba que se está ejecutando en un subproceso diferente.
EDIT # 1: algunas cosas para pensar
1) ¿Por qué acepta su formulario de registro en una solicitud GET y no en una solicitud POST? Esto es un abuso del verbo GET porque en realidad estás creando algo en el servidor
2) ¿Por qué llama a su propia API desde el interior de su aplicación y no coloca esta funcionalidad en un método que pueda invocarse desde todos los puntos finales que lo necesiten?
EDIT # 2:
Como se indica en los comentarios, el servidor de desarrollo es multiproceso