使用Django登录/注销用户

时间:2018-02-27 21:49:38

标签: python django

我目前正在与Django合作开展一个项目。我正在尝试使用python脚本实现登录和注销用户的能力,以便从客户端向服务器发送post请求。 我试图从我的应用程序注销用户,但它似乎不起作用。在我的登录功能中,这是用于登录用户的方法:

    # Function for user's login
    @csrf_exempt
    def loginUser(request):
        login_user = authenticate(username=user.customer_username, password=user.customer_password)
        if login_user is not None:
            if login_user.is_active:
                request.session.set_expiry(86400)
                login(request, login_user)
                print(request.user.is_active)
    http_response = HttpResponse()
    return http_response

打印结果为True,这意味着如果我没有错,登录方法是正确的。当我尝试使用此方法注销用户时:

    # Function for user's logout
    @csrf_exempt
    def logoutUser(request):
        # Loging out the user
        print(request.user.is_active)
        logout(request)
    http_response = HttpResponse()
    return http_response

它不会注销用户,并且打印结果在这里为False,这意味着用户没有登录。如果有人有任何想法,如何解决这个问题,那将非常有帮助。感谢。

2 个答案:

答案 0 :(得分:0)

我设法找到了这个问题的答案。因为我使用python脚本在服务器和客户端之间发送和接收发布请求,所以登录的当前用户由于客户端请求客户端和服务器之间的连接停止后未保存。因此,通过初始化全局Session对象并稍后使用该对象发出请求,它允许我在请求之间保留某些参数。 这是我在客户端使用的代码,用于发出请求:

import requests
from requests import Session
# Create the Json object for the login
data = {'username': username,
        'password': password}
r = requests.Session()
login_response = r.post("http://127.0.0.1:8000/api/login", data=data)
logout_response = r.post("http://127.0.0.1:8000/api/logout")

这是我在服务器端使用的代码:

# Function for user's login
@csrf_exempt
def loginUser(request):
    # Get the username and password from the post request
    username = request.POST['username']
    password = request.POST['password']
    login_user = authenticate(username=username, 
                                 password=password)
    if login_user is not None:
        if login_user.is_active:
            login(request, login_user)
            http_response = HttpResponse()
    return http_response


# Function for user's logout
@csrf_exempt
def logoutUser(request):
    # Loging out the user
    logout(request)
    http_response = HttpResponse()
    return http_response

感谢您的帮助!!

答案 1 :(得分:0)

评论可见性,Kyriakos,这是完全正确的。 我还试图通过使用 Django Auth (django.contrib.auth) 登录和注销来查询 Django,但在登录时使用自定义 python 脚本来测试 API 的帖子。没有全局请求会话,django.contrib.auth 登录尝试使用 request.user 时将始终显示匿名用户,这是罪魁祸首。

import requests
from requests import Session

r = requests.Session() #SETTING GLOBAL SESSION FOR DJANGO TO READ MY SESSION

x = r.post('http://127.0.0.1:8000/newsagency/api/login/', {'username':'jake', 'password':'UOL'})
print("login response: ", x.text)


x = r.post('http://127.0.0.1:8000/newsagency/api/poststory/', {'headline' :'Story 1',
                                                                   'category' : 'pol',
                                                                   'region' : 'w',
                                                                   'details' : 'some details'})
print("post story response: ", x.text)