web-dev-qa-db-fra.com

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

J'utilise Django pour construire un site Web simple. Lorsque vous tapez l'adresse de base (qui est pour l'instant 127.0.0.1:8000/), J'utilise Django pour afficher une vue qui vérifie et vous redirige en fonction de vos privilèges utilisateur. (Si vous avez des privilèges d'administrateur, vous allez dans /admin, sinon, allez à /home, et si vous n'êtes pas connecté, allez à /login.)

Lorsque je fais cette demande HTTP, je suis redirigé comme je le devrais mais je vois également les deux erreurs suivantes dans mon journal Django:

  1. code 400, message Mauvaise syntaxe de demande ('\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 à être (espaces ajoutés pour la lisibilité): SYN ETX NUL NUL U SOH NUL 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 comprendre pourquoi le serveur n'aimerait pas cela comme une demande, mais je n'ai aucune idée d'où cela vient.

Des idées?

Merci beaucoup.

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

Voici le code de la vue:

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')
54
Miriam

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.

94
David Horn

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.

4
Mnebuerquo

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
3