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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/4ff0c2cf-932d-4d8c-9cbf-1453ebefc4fe%40googlegroups.com.

Reply via email to