#django #http #hex #ascii #http-status-code-400
#django #http #шестнадцатеричный #ascii #http-status-code-400
Вопрос:
Я использую django для создания простого веб-сайта. Когда вы вводите базовый адрес (который на данный момент есть 127.0.0.1:8000/
), я использую django для отображения представления, которое выполняет некоторые проверки и перенаправляет вас на основе ваших пользовательских привилегий. (Если у вас есть права администратора, вы переходите к /admin
, если у вас их нет, вы переходите к /home
, и если вы не вошли в систему, вы переходите к /login
.)
Когда я делаю этот HTTP-запрос, я перенаправляюсь, как и должен, но я также вижу следующие две ошибки в моем журнале django:
- код 400, синтаксис неправильного запроса сообщения
('x16x03x01x00x95x01x00x00x91x03x01Nxaax9cx08x96x7fx92xe9Zx925xcaY4xa6xa5xabxf2x16xfaTx89xe7x8axc3x99J)6xfbxc44x00x00Hxc0')
"??N????Z?5?Y4?????T??ÙJ)6??4H?" 400 -
Я перевел шестнадцатеричное значение в первом из них следующим образом (пробелы добавлены для удобства чтения): 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 amp;
Я, конечно, понимаю, почему серверу это не понравилось бы как запрос, но я понятия не имею, откуда он берется.
Есть идеи?
Большое спасибо.
==============
Вот код для представления:
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')
Комментарии:
1. Возможно, вам следует показать код для представления.
2. вы пробовали добавлять завершающую косую черту к своим перенаправлениям?
3. Да, это ничего не меняет. Тем не менее, хорошая идея.
4. Неверный запрос также может возникнуть, когда мы отправляем пустые данные. Я получил эту ошибку, когда неосознанно отправлял пустой массив в запросах, когда он должен был быть непустым. Потребовалось некоторое время, чтобы разобраться
Ответ №1:
Чтобы ответить на ваш актуальный вопрос, это происходит, если вы пытаетесь получить доступ к серверу django по протоколу https. Переключитесь обратно на http, и эта ошибка исчезнет.
Ответ №2:
Я получаю такую ошибку при запуске:
manage.py runserver ...
вместо:
manage.py runfcgi ...
потому что я за Nginx.
Когда вы используете runserver, он прослушивает стандартные http-веб-запросы. Когда вы используете runfcgi, он прослушивает запросы другого типа, используя протокол fastcgi вместо обычного http.
Комментарии:
1.
python3 manage.py runfcgi 0.0.0.0:8001 Unknown command: 'runfcgi' Type 'manage.py help' for usage.
Ответ №3:
Вы могли бы реорганизовать это промежуточное программное обеспечение для обслуживания для достижения результата, потому что оно проверяет статус пользователя ПЕРЕД обработкой запросов содержимого, что кажется более djangonostic..
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
Комментарии:
1. Вы абсолютно правы; это лучшая стратегия django. Спасибо!