Django:400の不正なリクエスト構文 - このメッセージは何を意味しますか?

私は簡単なウェブサイトを構築するためにdjangoを使用しています。ベースアドレス(これは 127.0.0.1:8000/)を入力すると、djangoを使用して、いくつかのチェックを行い、ユーザ特権​​に基づいてリダイレクトするビューを表示します。 (管理者権限を持っている場合は、/home に移動しないと/admin に行き、ログインしていない場合は< code>/login )。

私がそのHTTP要求を行うと、私は私がするべきであるリダイレクトされますが、私はまた、私のdjangoログに次の2つのエラーが表示されます:

  1. code 400, message Bad request syntax ('\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 -

I translated the hex in the first one to be (spaces added for legibility): 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 &

私は確かになぜサーバーがその要求を気に入らないのかを知ることができますが、どこから来たのか分かりません。

何か案は?

どうもありがとう。

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

ビューのコードは次のとおりです。

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')
44
リダイレクトに末尾にスラッシュを追加しようとしましたか?
追加された 著者 Hedde van der Heide,
ビューのコードを表示する必要があります。
追加された 著者 Daniel Roseman,
はい、何も変わりません。しかし、良いアイデア。
追加された 著者 Miriam,

3 答え

あなたの実際の質問に対処するために、これはあなたがhttps経由でdjangoサーバにアクセスしようとしている場合に起こります。 httpに戻り、そのエラーは消えます。

82
追加された

このメンテナンスミドルウェアをリファクタリングして結果を達成することができます。これは、コンテンツ要求を処理する前にユーザーステータスをチェックするためです。

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
追加された
あなたは絶対に正しいです。それはより良いジャンゴ戦略です。ありがとう!
追加された 著者 Miriam,

私が実行すると、私はこの種のエラーが発生します:

manage.py runserver ...

の代わりに:

manage.py runfcgi ...

私はNginxの後ろにいるから。

runserverを使用すると、標準のhttp Web要求を待機しています。 runfcgiを使用すると、通常のhttpではなくfastcgiプロトコルを使用して、異なるタイプの要求をリスンします。

3
追加された
python3 manage.py runfcgi 0.0.0.0:8001不明なコマンド: 'runfcgi'使用するには 'manage.py help'と入力してください。
追加された 著者 Gank,
うーん。私はなぜこの答えがdownvoteを持っているのだろう...
追加された 著者 Mnebuerquo,