Hello! In my situation, I need to communicate with the django application through python from the desktop application (using python.requests).
The logic is this: 1 - Transfer the username and password to the login() - get and save to file the *session_id*. 2 - Use *session_id* from file to identify user for *get()* and *post()* requests. In order not to transfer login and password every time. 3 - Before each *post()* request, I make a *get()* request to get a CSRF code. What i get: If you use a fresh *session_id* (without saving to a file) then everything works. And if you use *session_id* from a file, then the user is identified only for *get()* requests. For *post()* requests, the user is not identified. So the question is: What am I doing wrong, or should it be so? Code examples: # In myApp/views.py def db_login(request): if request.method == 'POST': user = authenticate(request, username=request.POST.get('username'), password=request.POST.get('password')) if user is not None: login(request, user) return HttpResponse(json.dumps([True, "Logged In", dict(request. headers), request.user.username ])) else: return HttpResponse(json.dumps(False, "Not Logged In")) else: get_token(request) # adding csrftoken in cookies. return HttpResponse(json.dumps([request.method, request.user.username ])) def studio_create(request): if request.method == 'POST': return HttpResponse(json.dumps((request.method, dict(request.headers ), request.user.is_authenticated, request.user.username ))) else: get_token(request) # adding csrftoken in cookies. return HttpResponse(json.dumps((request.method, dict(request.headers ), request.user.is_authenticated, request.user.username ))) The case when everything works, when the user was identified by *session_id* when executing a *post()* request: # In Desktop app import requests def post_var1(): create_url=f'{HOST}db/studio/create/' login_url=f'{HOST}db/login/' cookie_path = '/tmp/cookie' # (1.0) get to login() sess = requests.Session() r1=sess.get(login_url) # (1.1) post to login() csrf_token = r1.cookies.get('csrftoken') r2 = sess.post(login_url, data=dict(username='vofka', password='1234', csrfmiddlewaretoken=csrf_token)) # (1.2) write cookie with open(cookie_path, 'w') as f: f.write(json.dumps(dict(r2.cookies))) # (2.0) get to create() sessionid = r2.cookies.get('sessionid') r3=sess.get(create_url, cookies = dict(sessionid=sessionid)) # (2.1) post to create() csrf_token = r3.cookies.get('csrftoken') r4=sess.post(create_url, data=dict(csrfmiddlewaretoken=csrf_token, cookies=dict(sessionid=sessionid))) print(r4.json()) >> ["POST", {"Content-Length": "102", "Content-Type": "application/x-www-form-urlencoded", "Host": "localhost:8000", "User-Agent": "python-requests/2.23.0", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Cookie": "csrftoken=JXTlxGsCPzj6LbeOfJwYJ2A2OYnVEucEp1WhhCF6C4ML2gGs4kJrOQEuXgm9SFSJ; sessionid=vuhkhofnxeh485ar0rocfnotdttmfbp3"}, true, "vofka"] The case when *session_id* from a file are used. And the user is identified only for *get()* requests. # In Desktop app import requests def post_var2(): url=f'{HOST}db/studio/create/' html = '/tmp/mtest.html' cookie_path = '/tmp/cookie' # (1) read cookie with open(cookie_path, 'r') as f: cookie=json.load(f) # (2) get to create() sess = requests.Session() r3=sess.get(url, cookies = cookie) # (3) post to create() csrf_token = r3.cookies.get('csrftoken') r4=sess.post(url, data=dict(csrfmiddlewaretoken=csrf_token, cookies=cookie )) >> print(r3.json()) >> ['GET', {'Content-Length': '', 'Content-Type': 'text/plain', 'Host': 'localhost:8000', 'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'csrftoken=JXTlxGsCPzj6LbeOfJwYJ2A2OYnVEucEp1WhhCF6C4ML2gGs4kJrOQEuXgm9SFSJ; sessionid=vuhkhofnxeh485ar0rocfnotdttmfbp3'}, True, 'vofka'] >> print (r4.json()) >> ['POST', {'Content-Length': '120', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'localhost:8000', 'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'csrftoken=JXTlxGsCPzj6LbeOfJwYJ2A2OYnVEucEp1WhhCF6C4ML2gGs4kJrOQEuXgm9SFSJ' }, False, ''] Django version 3.0.3 Python version 3.7.6 *settings.MIDDLEWARE* did not change from the creation of the project with the *startproject* command: # In settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/4ff0c2cf-932d-4d8c-9cbf-1453ebefc4fe%40googlegroups.com.