Я использую Python 3.6.8 с Django 2.2.5. Я построил API отдыха, и я хочу вызвать его через URL, используя мою функцию django view login_request (). Вот исходный код:
def login_request(request):
"""
This function is used to login all users except the admin of the entire site.
It makes an api call to the LoginView defined in commons.apiviews with
the necessary parameters and renders the necessary html file accordingly.
It gets the necessary data from the request.session variable.
"""
if request.method == 'POST':
# login_response = request_library.Response()
try:
user_data = {
"username": request.POST.get('username'),
"password": request.POST.get('password')
}
login_response = request_library.post(
"http://localhost:8055/commons/login/",
data=user_data,
headers={
'content-type': "application/x-www-form-urlencoded"
},
timeout=(3, 6)
)
login_response.raise_for_status()
except Exception as e:
# TODO find a better thing to do with the exception
with open('login_tries.txt', 'a') as login_response_objects:
login_response_objects.write(str(e) + "\t" + str(request.body) + "\n\n")
else:
if login_response is not None:
# user_token = login_response.token
messages.info(request, f"You are now logged in as {request.data.get('username')}")
return redirect('ui/dashboard.html')
else:
return HttpResponse("didn't work")
return render(request=request, template_name="ui/login.html", context={})
То, что он должен делать, всякий раз, когда http://localhost:8055/commons/login/
отправляется с именем пользователя и паролем, он возвращает 200 и токен авторизации в качестве ответа. Вышеуказанное используется в следующем html-файле:
{% block content %}
<link rel="stylesheet" href="{% static 'ui/css/login.css' %}">
<!-- that's it -->
<div class="container-fluid">
<div class="row">
<div class="col-sm-12">
<form class="form-signin" method="POST" name="form">
{% csrf_token %}
<img class="mb-4" src="{% static 'ui/images/logo.jpg' %}" alt="sms.et logo" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">Please Login</h1>
<label for="inputUsername" class="sr-only">Username</label>
<input type="text" id="username" class="form-control" placeholder="Username" required autofocus name="username">
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" id="password" class="form-control" placeholder="Password" required name="password">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
<p class="mt-5 mb-3 text-muted">© 2019 - 2020</p>
</form>
</div>
</div>
</div>
Но это не работает. Когда я пытаюсь с помощью username=aa
и password=aa
получить ответ от функции login_request (), возникает исключение, в котором указано
400 Client Error: Bad Request for url: http://localhost:8055/commons/login/ b'csrfmiddlewaretoken=ejxjmuIs5WwQRGlr6SLQr9Uhtb6qcxlguIEqjZo2V0vWkjemaKIaSqTEvZX1lEhY&username=aa&password=aa'
, что означает событие, хотя я этого не говорил, функция login_request () отправляет csrfmiddlewaretoken
на URL. Итак, мой вопрос, как мне это исправить? и как я могу вызвать API с точки зрения Django?