Я создаю приложение в .NET, которое будет служить вторым пользовательским интерфейсом для моего уже развернутого приложения Django. Для некоторых операций пользователи должны аутентифицировать себя (как пользователи Django). Я использовал супер-простой способ сделать это (без шифрования учетных данных для простоты): -
Шаг 1. Я создал представление django, которое приняло имя пользователя и пароль через два параметра HTTP GET и передало их в django.contrib.auth.authenticate () в качестве аргументов ключевого слова. Смотрите код ниже:
def authentication_api(request, raw_1, raw_2):
user = authenticate(username=raw_1, password=raw_2)
if user is not None:
if user.is_active:
return HttpResponse("correct", mimetype="text/plain")
else:
return HttpResponse("disabled", mimetype="text/plain")
else:
return HttpResponse("incorrect", mimetype="text/plain")
Шаг 2. Я назвал это, используя следующий код в .NET. 'StrAuthURL' в следующем представляет простой URL-адрес django, сопоставленный с представлением django выше:
Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest)
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
Dim result As String = reader.ReadToEnd()
HttpWResp.Close()
Это работает безупречно, хотя это не более чем подтверждение концепции.
Теперь я хочу сделать это через HTTP POST, поэтому я сделал следующее: -
Я создал представление django для выполнения аутентификации с использованием данных POST
def post_authentication_api(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.is_active:
return HttpResponse("correct", mimetype="text/plain")
else:
return HttpResponse("disabled", mimetype="text/plain")
else:
return HttpResponse("incorrect", mimetype="text/plain")
I have tested this using restclient and this view works as expected. However I can't get it to work from the .NET code below:
Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest)
request.ContentType = "application/x-www-form-urlencoded"
request.Method = "POST"
Dim encoding As New UnicodeEncoding
Dim postData As String = "username=" & m_username & "&password=" & m_password
Dim postBytes As Byte() = encoding.GetBytes(postData)
request.ContentLength = postBytes.Length
Try
Dim postStream As Stream = request.GetRequestStream()
postStream.Write(postBytes, 0, postBytes.Length)
postStream.Close()
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
Dim responseStream As New StreamReader(response.GetResponseStream(), UnicodeEncoding.Unicode)
result = responseStream.ReadToEnd()
response.Close()
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
Сервер выдает мне 500 внутренняя ошибка сервера. Я предполагаю, что запрос POST неправильно настроен в .NET. Поэтому мне, по сути, нужны некоторые инструкции о том, как вызывать представление django из .NET для отправки POST-данных.
Спасибо,
CM