54 votes

Django: 400 mauvaise syntaxe de demande - que signifie ce message?

Je suis à l'aide de django pour construire un site web simple. Lorsque vous tapez l'adresse de base (qui pour l'instant est 127.0.0.1:8000/), j'utilise django pour afficher une vue qui fait quelques vérifications et les redirections en fonction de vos privilèges d'utilisateur. (Si vous avez des privilèges d'administrateur, vous allez à '/admin', si vous ne vous sentez pas que vous allez à '/home', et si vous n'êtes pas connecté, vous allez à '/login'.)

Quand je fais que de la requête HTTP, je reçois redirigé comme je le devrais , mais je vois aussi les deux erreurs suivantes dans mon django journal:

  1. code de 400, le message de requête incorrecte de la syntaxe ('\x16\x03\x01\x00\x95\x01\x00\x00\x91\x03\x01N\xaa\x9c\x08\x96\x7f\x92\xe9Z\x925\xcaY4\xa6\xa5\xab\xf2\x16\xfaT\x89\xe7\x8a\xc3\x99J)6\xfb\xc44\x00\x00H\xc0')
  2. "??N????Z?5?Y4?????T??ÙJ)6??4H?" 400 -

J'ai traduit l'hex dans le premier (espaces ajoutés pour la lisibilité): SYN ETX NUL U SOH NUL Q ETX NUL N 170 156 X r 246 STX 141 214 ? 143 EOT FS j 142 223 s 241 220 < 185 \ \ m 242 &

Je peux certainement voir pourquoi le serveur ne serait pas comme ça comme une demande, mais je n'ai aucune idée d'où ça vient.

Des idées?

Merci beaucoup.

==============

Voici le code pour l'afficher:

def index(request):
    user = request.user
    admin_courses = []

    if (user.is_authenticated()):
        u_id = user.getUserId()
        my_enrollment = Enrollment.objects.filter(user_id=u_id)
        admin_enrollment = my_enrollment.filter(type="ADMIN")
        for enr in admin_enrollment:
            course = Course.objects.get(id=enr.getCourseId())
            admin_courses.append(course)
        if (len(admin_courses)>0):
            return HttpResponseRedirect('/admin')
        else:
            return HttpResponseRedirect('/home')
    return HttpResponseRedirect('/login')

97voto

David Horn Points 361

Pour répondre à votre question réelle, cela se produit si vous essayez d'accéder au serveur django via https. Revenez à http et cette erreur disparaîtra.

5voto

Mnebuerquo Points 1664

J'obtiens ce genre d'erreur lorsque je lance:

 manage.py runserver ...
 

au lieu de:

 manage.py runfcgi ...
 

parce que je suis derrière Nginx.

Lorsque vous utilisez runserver, il écoute les requêtes Web http standard. Lorsque vous utilisez runfcgi, il écoute un autre type de demande, en utilisant le protocole fastcgi au lieu de http simple.

3voto

Vous pouvez refactoriser ce middleware de maintenance pour obtenir le résultat, car il vérifie le statut de l'utilisateur AVANT de traiter les demandes de contenu, ce qui semble plus djangonostique.

 import settings
from django.http import HttpResponseRedirect


class MaintenanceModeMiddleware(object):
    """
    Maintenance mode for django

    If an anonymous user requests a page, he/she is redirected to the
    maintenance page.
    """
    def process_request(self, request):

        is_login = request.path in (
            settings.LOGIN_REDIRECT_URL,
            settings.LOGIN_URL,
            settings.LOGOUT_URL,
            settings.MAINTENANCE_PATH,
        )
        if (not is_login) and settings.MAINTENANCE and (not request.user.is_authenticated()):
            return HttpResponseRedirect(settings.MAINTENANCE_PATH)
        return None
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X