로그인(세션)에 로직에 대해 질문이 있습니다. 현재 개발이 안드로이드(client) – 장

 
양팀장

로그인(세션)에 로직에 대해 질문이 있습니다.
현재 개발이 안드로이드(client) – 장고(server) 구성입니다.

제가 세션 개념이 별로 없어서…
예전 php 웹개발할때는 그냥 서버에서 세션생성하고 생성변수로 원하는 변수 생성해서 쓰면 됐었는데…

지금은 앱과 서버의 로그인 체크라서…

제 생각이 맞는지 좀 체크해주세요.

######### 로그인(세션ID, 세션변수 생성) ##########
0.(client) 안드로이드에서 ip, pw로 로그인 시도(http연결)
1.(server) 서버에서 세션ID 및 세션변수(id, pw)생성
(저장은 특정폴더 및 MySQL에 저장한다.)
2.(server) 서버응답으로 세션ID을 넘겨줌.
3.(client) 안드로이드에서 세션값을 저장함(파일 혹은 sqlite3)

############ 로그인 체크 ###################
4.(client) 안드로이드에서 로그인 확인시 client에 저장되어 있는 세션값을 서버에 넘겨줌(POST 혹은 GET)
5.(server) 세션저장하는 곳(저장 폴더 혹은 MySQL)에서
세션ID 및 세션변수(id, pw) 있는지 확인
세션ID에 해당하는 세션변수(id,pw)가 있으면 로그인 되어 있는 상태로 알려주고
세션ID에 해당하는 세션변수(id, pw)가 없으면 로그인아웃된 상태로 알려준다.

이 로직이 맞는 말인가요?

  • Haeseong Choi

    네. 그런데, httprequest 시 get 으로 하셔야 쿠키를 가져옵니다.(아이폰도 동일) 그리고 장고에서 CSRF 토큰을 체크하기 때문에 이부분도 처리를 하셔야 할 것 같습니다. 제 경우엔 안드로이드앱에서 이 부분을 처리 못해서 View 의 함수부분에 csrf_exempt 데코레이터로 처리했습니다. 파이어버그로 장고프레임워크 사용하실 때 리턴값을 보시면 대략적으로 이해가 가능하실 겁니다.

    쿠키는 서버에 접속하면(get) 서버가 생성해서 안드로이드 단말로 던져줍니다. 서버에선 이때 생성된 쿠키를 디비에 저장한 상태구요. (추후 세션체크를 위해) 이걸 먼저 저장하신 다음 로그인할 때(POST) 저장된 세션데이터와 ID, PW값을 서버로 던지면 로그인 여부 확인을 한 뒤 오케이면 로그인 정보가 담긴 세션을 새로 만들어서 안드로이드쪽에 던지고, 서버는 세션 디비에 저장합니다. 대략 이런 형태로 저장이 되더라구요.

    쿠키는 정보가 클라이언트에, 세션(세션쿠키)는 정보가 서버에 저장된다고 생각하시면 구현하는데 편하시지 않을까 합니다.

    양팀장

    친절한 답변 감사합니다.
    구현해보도록하겠습니다. ^^

혹시 flask에서 View를 모듈화해서 사용하고 계신분 있으신가요 ?? django처럼

 
KwangRok Ahn

혹시 flask에서 View를 모듈화해서 사용하고 계신분 있으신가요 ?? django처럼 view를 모듈화할려고 하는데 도무지 아이디어가 안떠오르네요 … 아! 그리고 flask programming style을 배울만한 적절한 open source project알고계신게 있으시면 추천좀부탁드립니다!

  • Kim JongOk

    flask의 Blueprint 를 이용하시면 될것 같습니다

    Kwon-Han Bae

    https://github.com/langdev/langdev.org

    KwangRok Ahn

    Kim JongOk, 배권한 두분 답변 감사드립니다! 정말 많은 도움이 되었습니다 ㅎㅎ

ab.com/search/ 위와 같은 형태의 url을 구현(?)하고 싶은데 u

 
Han Cold Kim

ab.com/search/

위와 같은 형태의 url을 구현(?)하고 싶은데

urls.py에 어떻게 해야될까요??

그냥 ab.com/search/만 호출되면 검색창을 보여주고

ab.com/search// 이렇게 호출되었다면

에 대한 검색결과를 출력해주고싶은데…

urls.py에 어떻게 해야할지 모르겠어요…;

  • Seung-Hyo Seo

    url(‘^/search/(?P\w+)/$’,xxxx.search)
    정도면 될……

    Jung Kyoung Up

    url에 직접 검색어 같은 값을 넣는건 인코딩하며 꼬일 수 있어서 좋지 않고요 그냥 GET 방식으로 하시는걸 추천합니다.

    Han Cold Kim

    두분답변 감사드립니다!!

    아 그리고 Seung-Hyo Seo님 답변대로 적용했을때에는…

    그냥 abc.com/search/ 패턴에 대해서는 패턴에 없다고 나오네요…;

    동시에 처리할순 없을까요??

    박영록

    url(‘^/search/(?P\w+)?$’,xxxx.search)

    Han Cold Kim

    아 물음표를 통채로 넣어주면 되는군요!! 박영록님 감사드립니다!

쉽고 빠른 웹 개발(pdf) 90쪽 보고있는데요…~ 모델… 잘 이해가 안되네요..

 
Han Cold Kim

쉽고 빠른 웹 개발(pdf) 90쪽 보고있는데요…~

모델… 잘 이해가 안되네요…;

59쪽

>>> from django.contrib.auth.models import User
>>> from bookmarks.models import *
>>> user = User.objects.get(id=1)
>>> link = Link.objects.get(id=1)
>>> user.bookmark_set.all()

위에서 보면 마지막에 user객체에 bookmark_set.all() 속성(?) 메소드(?)를 이용해서 id=1번의 bookmark를 가져오고…

90쪽

>>> from bookmarks.models import *
>>> bookmark = Bookmark.objects.get(id=1)
>>> bookmark.link.url
http://www.packtpub.com/’
>>> tag1 = Tag(name=’?’)
>>> tag1.save()
>>> bookmark.tag_set.add(tag1)

위에서 역시 마지막에 bookmark 객체에서 tag_set.add()메소드를 통해서 tag1 객체를 추가하는데요…

객체.x_set.all() 또는 객체.x_set.add() 이렇게 사용하는것에 대해서

x부분이 어떤 부분의 이름을 가져오는건지 잘 모르겠네요…;

class Bookmark(models.Model):
title = models.CharField(max_length=200)
user = models.ForeignKey(User)
link = models.ForeignKey(Link)

Bookmark객체는 다음과 같이 models.py에 정의(?)되어있는데

보면… tag라는 컬럼은 존재하지 않는데

어떻게

bookmark객체에서 tag_set.all()이라는걸 사용할수 있는거죠?

아 물론

class Tag(models.Model):
name = models.CharField(max_length=64, unique=True)
bookmarks = models.ManyToManyField(Bookmark)

Tag 모델에서 bookmarks컬럼에서 ManyToManyField를 사용해서 어떤 연관이 있을것같은데…

정확히 어떻게 연결되는지 해설좀 부탁드립니다…!

쉽고 빠른 웹개발 Django를 보고있습니다… forms.py에서 비밀번호 변경을 구

 
Han Cold Kim

쉽고 빠른 웹개발 Django를 보고있습니다…

forms.py에서 비밀번호 변경을 구현하고자

현재 비밀번호와 사용자가 입력한 비밀번호가 똑같은지 체크하려고 합니다….

그래서 현재 로그인한 사용자의 정보를 얻어와야하는데…

어찌해야하나요…?

User.objects.get()으로 가져와서 비교해야할것같은데 현재 로그인된 사용자를 인수로 넣으려면…?

  • Han Cold Kim

    김용현님 답변 감사드립니다!! 오오 기본으로 구현된것도 있군요…!! 어째든 저는 이건 제가 직접 구현해보고싶은데요 처음에 댓글달아주신 check_password함수로 체크한다음 true가 떳을때 set_password로 변경을 진행하려고하는데…

    User.objects.get(username=username).check_password(pass) 이런식으로 forms.py에서 사용하고싶은데요…

    get(username=여기에 어떤 인자를 넘겨야할꺼같은데… 이 인자를 현재 로그인된 사용자의 정보를 넣고 싶은데… 어찌해야할까요?

    Chinseok Lee

    직접 구현하시더래도, 기존 코드도 한 번 읽어보세요.
    코드도 그리 길지 않습니다. 🙂

    Han Cold Kim

    forms.py에서 할수는 없을까요?? forms.py에서 현재비밀번호, 새비밀번호, 새비밀번호 확인 폼 3개 만들고, 일단 현재미밀번호가 맞는지 체크한다음 새비밀번호 두개가 일치하는지 확인은 views.py에서 is_valid로 검사하려고 하거든요… 이상한 루틴일까요…?

    Han Cold Kim

    ChinSeok Lee 아 네 알겠습니다!! 감사합니다!

    Chinseok Lee

    각 필드명이 아래와 같다고 하면,

    현재 비밀번호 : current_password
    새 비밀번호 : new_password
    새 비밀번호 확인 : new_password2

    form 에서
    clean_current_password 에서는 check_password 만 검사해서 틀리면 ValidationError 예외 발생시키구요.
    clean_new_password 는 암호 validation (길이나, 영문자를 섞어써야된다든지 규칙 검사)
    clean_new_password2 에서는 new_password 와 같은 지 여부만 검사하는 식으로 구현하실 수 있겠네요.

    Chinseok Lee

    그리고, save 루틴에서 set_password 호출하시면 되실 듯 하네요.

    Han Cold Kim

    김용현님 그럼 현재 id를 POST로 넘기라는 말씀이신가요?? 흠… 다른 방법은 없을까요??

    Han Cold Kim

    ChinSeok Lee님 감사드립니다… 저도 비슷하게 생각했는데 ㅎㅎ 이상한 루틴은 아니였나보군요… ㅎ

    Chinseok Lee

    김용현님 말씀은, Form 객체 생성시에 request.user 도 같이 넘기시라는 거 같습니다.

    Han Cold Kim

    아 Form객체 생성시에…!!! 아…!!! 무슨말씀이신지 알겠네요!! 감사합니다. 두분! 지금 구현하러 갑니다~

    Chinseok Lee

    class MyForm(forms.Form):
    … def __init__(self, user, *args, **kwargs):
    ……. self.user = user
    ……. super(MyForm, self).__init__(*args, **kwargs)

    위와 같다고 하면, 뷰에서 POST 시에는 MyForm(request.user, request.POST) 이렇게 생성하는 거죠. GET 에서는 MyForm(request.user) 가 되구요.

    Han Cold Kim

    네네 이해했습니다.. 부연설명까지… 너무 감사드립니다. ㅎㅎ

    Han Cold Kim

    감사합니다. ㅎㅎ

    Han Cold Kim

    기본 소스 읽고있는데…

    http://docs.nullpobug.com/django/trunk/django.contrib.auth.forms-pysrc.html#SetPasswordForm

    이해가 쉽지 않네요… ^^;

    Han Cold Kim

    146번째 줄에 init함수… 꼭 있어야하는건가요??

    Han Cold Kim

    책 기본예제에서는 생성자 없이 그냥 폼 생성하면서

    Han Cold Kim

    폼 생성시 인자 갯수대로 변수 초기화시켰는데… 음.. 생성자… 쓰면 어떤 장점이 있죠…? 그리고 제가 모르는… super메소드도 사용하네요…

    Han Cold Kim

    으으… 쉽지 않네요… 저는 모의해킹 업무를 하는데… 사실 제 업무에서는 코드작성을 체계적으로 예쁘게 해야될 필요가 없어서 막 했고 고급기능(?)은 필요하지않으면 쓰지 않았는데… 좀 python부터 체계적으로 공부해야될 필요가 있는것같네요…;;

    Han Cold Kim

    으 클래스를 이렇게 작성했는데… 안되네요…;;
    http://pastebin.com/tuEYGajq

    김용현님께서 말씀해주신것처럼 PasswordModificationForm(request.user, request.POST)로 사용하려면 class를 어떻게 작성해야 하나요…?

    Han Cold Kim

    아 *args, **kwargs도 추가해야 request.POST까지 받을수 있는거군요…

    Han Cold Kim

    하~~ 쉽지 않네요~~~ 궁금한것이 있습니다…

    http://pastebin.com/5raw8vVX

    위 class(책에 나온 예제입니다.)는 생성자도 정의하지 않았는데 어떻게 부모클래스인 forms.Form에 변수를 전달하는거죠…?

    Chinseok Lee

    상속받은 클래스에서 생성자를 구현하지 않았기 때문에, 부모 클래스 (forms.Form) 클래스의 생성자가 호출됩니다.

    위 코드에서 생성자를 구현한 것은 정의된 form fields 이외에 user 인자를 추가적으로 받기 위해서, 생성자를 구현한 것입니다.

    Han Cold Kim

    아 그렇군요… 자식클래스에서 생성자를 구현하지 않으면 부모클래스의 생성자가 호출되는군요… ! 감사합니다!!

    Han Cold Kim

    그나저나

    http://pastebin.com/XpGLkwCu

    위 코드에서 19행을 추가시켜서

    http://docs.nullpobug.com/django/trunk/django.contrib.auth.forms-pysrc.html#SetPasswordForm.__init__

    이것과 비슷하게 흉내를 내봤는데..(super은 당최 뭔지 모르겠더라고요…)

    여전히 동작을 안하네요…;

    Chinseok Lee

    19번째 줄에 부모 클래스 생성자 코드에 오류가 있습니다.
    아래 코드는 부모 클래스 생성자를 호출한 것이 아니라, PasswordModificationForm 객체를 하나 더 만든 것입니다.

    PasswordModificationForm().__init__(*args)

    아래와 같이 변경해야 합니다.

    super(PasswordModificationForm, self).__init__(*args)