• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

데코레이터 관련(새로운 프로젝트에 적용)

21.07.02 19:38 작성 조회수 109

0

안녕하세요.

강의듣고 난후 새로운 개인적 프로젝트 개발중입니다.(코린이 수준, 비전문 개발자라고 할까요. 코딩은 이번이 거의 처음입니다.)

강의는 accountsapp의 User를 기존 class를 이용하여(class AccountCreateView(CreateView):) 생성하였는데

저는 모델을 적용 class Prouser(models.Model) 하여 생성했습니다.  (이메일 인증과정을 추가하느라...)

그리고 프로필 모델을 

이렇게 만들었습니다. 그리고 데코레이터 는 강의중에 나오는 데로,,,아래처럼 했더니,,,작동이 잘안됩니다.

유저는 pk가 3인 vend01이라는 로그인 id소유자입니다. 물론 아직 프로필을 생성하지 않은 상태이구요,,,

그런데.... 다른 사람( pk=2)의 프로필 업데이트 페이지로 진입됩니다. 게다가... 

만들지 않은 프로필의 주소로 진입시도하면.....아래처럼 나옵니다. 아무리 수정할 려고 여러 코드로 해보아도 해결이 되지 않습니다. 

처음 만들어보는 프로젝트라 해결할 부분을 선생님 강의를 들으면서 잘 찾아가고 있는데 여기가 통 해결이 되질 않습니다.

무엇이 문제일런지요????

그리고 추가로 pk관련 아래 이미지도 맞게 제가 정리한 것인지 검토부탁드립니다.

=============================================================================================

추신)))) 그리고 이 데코레이터 부분을 제대로 작성하고 나면 하나 해결해야 할 부분이 있을 것으로 생각되는데요...

가입유저에 level를 적용하여 customer와 vendor로 나누었습니다.

선생님 강의중에 한명이 두개이상의 프로필을 만들 수 있다고 하셔서, 여기저기 뒤져가며 코딩을 해봤는데 구현이 되질 않았습니다. 그래서 프로필 모델은 하나로 통째로 만들고 유저의 level에 따라 데코레이터를 적용하는 방식으로 해결하려고 구도를 잡았습니다. 그것을 구현하는 과정에 난항이 예상되고 있습니다. 실험삼아 만들어보는 다른 프로젝트에서 모델 하나의 유저에 level를 만들어서 데코레이터 방식은 적용을 해봤는데 잘되었습니다. 그러나 이번 만들어보는 프로젝트에서도 약간의 app들의 구조가 달라 잘 구현될 지 해봐야 알것같습니다. 안되면 그때 또 질문을 남기겠습니다.

답변 1

답변을 작성해보세요.

0

안녕하세요!
질문 확인했습니다.

일단 제가 보기에 질문주신 문제가 2가지인것 같습니다.

1. 원하지 않는 프로필 업데이트 페이지로 향한다.
2. 없는 프로필 업데이트로 들어갔을 경우 에러가 뜬다.


일단 2번문제는..
정상적인 것이겠죠?

당연히 없는 프로필에 접근했으니 DoesNotExist 에러를 발생시키는 것이 맞아보입니다.

만약 이런 에러를 없애고 싶다면, 
데코레이터 내부에 해당 pk 를 가지는 프로필이 존재하는지 확인하고나서,
인증을 진행하는 과정을 추가하시길 바랍니다.


그리고 1번 문제 같은경우에는,
질문에 코드를 포함시키지 않았지만,
template 내부에 url 문을 작성하시면서
profile 의 pk 를 가져와야 하는 것을 user의 pk값을 가져오시는 듯 합니다.

그래서 저런식으로 원하지 않는 루트로 들어가는 것으로 추정됩니다.

강좌 내 코드가 아니라서
답변에 한계가 있을 수 있지만 도움이 되셨으면 좋겠네요.

-------------------------

그리고 죄송한 말씀을 한가지 드리자면,
저도 알고 있지만, 답변이 부족합니다.

마지막으로 pk 관련해서 정리를 제대로 한것인지 검토해달라고 부탁하셨는데,
답변을 드리지 못할것 같습니다.

제 강좌 내에서 함께 진행한 코드에 대해서 질문을 주시고, 답변해드리는 것은
강좌를 만들고 판매한 분명한 제 책임, 역할이 맞지만

이후 이 강좌를 배운 내용을 바탕으로 새로이 만드신 프로젝트에서 발생하는 시행착오에 대해
질문을 주시는 것은 답변을 드리는 것에 한계가 있을 수 있다는 점 말씀드립니다.

다른 사람이 작성한 코드를 읽고서, 이해하고 문제를 해결하는 것은
생각보다 시간이 정말 많이 들어가는 작업인지라

제가 시간이 정말 많으면 시간 내서 소스코드 전체를 읽어드리고 싶지만,
최근에 너무 바빠서 여유가 너무 없다는 점 조금은 이해 부탁드립니다.

질문을 주시느라 자료를 정리하시고,
작성해주신 질문글도 적은 양이 아닌데,
이런 말씀 드려서 너무 죄송하네요.

그래도 강좌 잘 들어주셔서 너무 감사하고,
이렇게 찾아주셔서 감사합니다.

좋은하루 보내시길 진심으로 바라겠습니다.

감사합니다.

moljin님의 프로필

moljin

질문자

2021.07.03

답변 감사합니다.

1. 질문에는 적지 않았지만, 없는 자신의 프로필로 접근 했을 때 체크하는 코드도 시도해봤습니다.

def profile_ownership_required(func):
    def decorated(request, *args, **kwargs):
        profile_obj = Profile.objects.get(pk=kwargs['pk'])
        if not profile_obj.user != request.user:
            return HttpResponseForbidden()
        if profile_obj is None or not profile_obj:
            return redirect('/profiles/prouser-profile-create')
        return func(request, *args, **kwargs)
    return decorated

그런데 증상은 똑같습니다. (직접 주소창에 업데이트 페이지에 pk를 숫자를 넣어서 접근했더니...) 답변받고 다시 눈 크게 뜨고 다시 해밨는데 마찬가지구요....

2. 프로필이 있는 타인의 업데이트 주소도 템플릿에 링크 url을 작성하여 넘어간게 아니라,

주소창에 직접 타인의 프로필 업데이트 페이지에 /pk를 적어서 접근했습니다. 그러니 당연히 user pk를 주소창에 적은 것이지요...접속이 되는것을 막을 수 없었습니다. 먼가...request.session과 제가 만든 prouser.pk, user.pk, profile.pk를 염두에 두고 연결시켜얄것 같은데....영 해결이 안되고 있습니다.

먼가 해결법이 있을 것같긴 한데 통 떠오르질 않습니다. 코린이도 아니고 50대 코딩의  완전  젓먹이 영유아 수준이라...ㅎㅎ 여러 고개를 넘어왔는데 여기가 문젭니다. 

추신)) 그리고 pk 추신 질문에 대한 답변은 굳이 기대하지는 않았습니다. 정리한 것도 개발자 노트를 아직 쓰고 있는 단계가 아니라 그냥 제가 참고할 려고 저장하고 있던 참이었습니다.  전혀 죄송해하실 필요는 없습니다. 오히려 제가 쓸데없는 질문을 했던게 죄송할 따름입니다. 꾸벅꾸벅..ㅎㅎ