Что вызывает ошибку Unexpected Keyword 500 при попытке передать данные из URL в качестве переменной с помощью Django?
Я прохожу онлайн-курс и воспроизвожу код преподавателя на моем Mac в VS Code, чтобы помочь мне узнать, как он работает; и это не проблема домашнего задания. Преподаватель показывал, как динамически создавать ответы на основе URL, отправляя последнюю часть url в качестве переменной в функцию, которая затем генерирует ответ. Однако, когда я пробую это сделать, я получаю ошибку 500. Я просмотрел свой код, и он выглядит идентично инструкциям, только с добавленными комментариями. Фиксированные пути работают нормально, т. е.
path("brian", views.brian, name = "brian"),
работает нормально, но вот это не получается:
path("<str:name>", views.greet, name = "greet")
ошибка:
[18/Jul/2024 20:50:39] "GET /hello/jim HTTP/1.1" 500 59430
[18/Jul/2024 20:50:41] "GET /hello/ HTTP/1.1" 200 5
Internal Server Error: /hello/jim
Traceback (most recent call last):
File "/Users/XXX/Documents/Work/Python Projects/Dashboard/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/XXX/Documents/Work/Python Projects/Dashboard/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: greet() got an unexpected keyword argument 'Name'
Я создал несколько фрагментов кода: (комментарии мои, чтобы потом, когда я вернусь к коду, я мог его понять)
- Создано приложение hello и добавлено к установленным приложениям в settings.py
ALLOWED_HOSTS = []
# Application definition
INSTALLED_APPS = ['hello',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
] # which apps - such as hello to include in web app
2. Определен путь для использования в urls.py в каталоге hello:
from django.urls import path
from . import views
urlpatterns =[
path("", views.index, name = "index"),
path("brian", views.brian, name = "brian"),
path("<str:name>", views.greet, name = "greet")
]#returns the function greet from views as a web page for /hello paths, "brian" adds /brian to end of hello as web page to load
3. Добавлены urlpatterns в urls.py в корневом каталоге проекта
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', include("hello.urls")) # tells django to include urls from urls file in hello
]
4. Определена функция "greet" в файле views.py в каталоге hello:
from django.shortcuts import render
from django.shortcuts import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello")
def brian(request):
return HttpResponse("Hello Brian")
def greet(request, new_name):
return HttpResponse(f"Hello,{new_name}") # fstring - says use the value of {name} in displayed text; parameter name is a returned variable to greet
когда я на локальном сервере ввожу url, например:
http://127.0.0.1:8000/hello/brian -> работает, как и ожидалось
http://127.0.0.1:8000/hello/jim -> Я получаю ошибку 500, о которой я говорил выше.
Имя параметра по-прежнему должно быть name
, поэтому:
def greet(request, name):
return HttpResponse(f"Hello,{new_name}")
Проблема заключается в самом url.
path("<str:name>", views.greet, name = "greet")
измените url следующим образом
path("<str:new_name>", views.greet, name = "greet")
ваш параметр должен совпадать с именем параметра, указанным в url