2021년 2월 22일 월요일

Django RestFramework 스터디

 (1) OneQ 웹 프레임워크 Django(python) 개념 정리

- 프레임워크: lib는 사용자가 호출. framework는 framework이 사용자 코드를 호출


(2) OneQ 웹 프레임워크 Django 실습


(3) [T24] 장고 01강_웹프로그래밍과 Django


-여기 까지는 DJango에 대한 부분으로 상기한 링크 자료만 학습하면 됨. 

아래는 Django REST framework에 대한 부분으로 실습 해보아야 됨.

- DJango 학습 시에 유의할 사항은 django project(1개만 있음) 하에서 여러 app이 존재할 수 있다는 것을 이해. 

app은 user관리, 결제처리, 등등... 필요에 따라 추가할 수 있으며 folder단위로 관리됨, 재 사용도 가능하다. 


(4) [이 부분이 가장 중요] REST API Guide - Productionizing a Machine Learning model by creating a REST API with Python Django and Django REST Framework 


(5) Django  REST framework Quickstart


[참고] 자주 나오는 Serializer 클래스는 Model 데이터를 json으로 바꾸는 역할을 한다. 이 클래스를 만들고 model 데이터를 이 클래스 객체에 던져주면 json으로 바뀌어서 리턴된다. 


[References]

1. Database 연동하기 - Model설계, Migration 



댓글 13개:

  1. [유용한 library]
    https://pypi.org/project/drf-api-logger/

    답글삭제
  2. [curl 명령셋]
    curl -X POST -F file=@1.mp4 -F file=@2.mp4 "http://127.0.0.1:8000/api/upload/video/"
    curl -X POST -F file=@./image/1.jpg -F file=@2.jpg "http://127.0.0.1:8000/api/upload/image/"

    curl "http://127.0.0.1:8000/api/upfilelist/image/"
    curl "http://127.0.0.1:8000/api/upfilelist/video/"

    curl "http://127.0.0.1:8000/api/deletion/image/"
    curl "http://127.0.0.1:8000/api/deletion/video/"

    curl -X POST -F file=@f1.jpg "http://127.0.0.1:8000/api/people/"

    curl -X POST -F file=@0.json "http://127.0.0.1:8000/api/run/"
    curl "http://127.0.0.1:8000/api/onprocessing/"
    curl "http://127.0.0.1:8000/api/result/"

    [Authentication]
    curl -u hongildong:***** "http://127.0.0.1:8000/api/result/"

    답글삭제
    답글
    1. [공유기 설정 및 외부에서 장고 접속]
      1. ip공유기에 들어 간다: 192.168.0.1 -> id, 비번 넣고 접속.
      기본설정->시스템요약정보: 외부 ip주소(외부에서 내컴에 접속할 떄 사용하는 주소) 확인 가능

      2. 고급설정->NAT/라우터관리->포트포워드설정: 내부 ip 확인가능(공유기에서 내컴에 자동할당한 주소).
      여기서 새규칙 추가: 내부 ip주소 넣고, 외부 포트번호(외부에서 내컴 접속시 사용할 포트번호), 그리고,
      내부 포트(예를 들어 8000번으로 설정하면, 장고 실행 시에 python manage.py runserver 192.168.0.7:8000 그 포트번호 사용해야 함)
      번호 설정 후, 수정->저장.

      3. 장고 project/setting.py파일 내에
      ALLOWED_HOSTS = ['132.145.345.234'] # 내컴(공유기)의 외부 포트 번호 기입.

      4. 장고 서버를 실행 후(python manage.py runserver 192.168.0.7:8000),
      외부에서 또는 폰에서
      외부 ip주소: 외부포트 번호(예, 132.145.345.234:3838/admin)로 접속하면 장고서버로 접속 된다.



      삭제
    2. [DEBUG=False, static 깨지는 것]
      > python manage.py runserver 192.168.0.7:8000 --insecure
      (참고) https://www.inflearn.com/questions/16481

      삭제
  3. [models-serializers-views-urls 연결되는 코드 이해]
    https://pypi.org/project/django-easy-drf/

    답글삭제
  4. > pyarmor o --recursive --exclude dnn,icons,query main_gui.py
    > pyarmor hdinfo
    > pyarmor licenses \
    --expired "2018-12-31" \
    --bind-disk "****04PBN2081SF3NJ5T" \
    --bind-mac "70:**:**:23:f0:94" \
    --bind-ipv4 "***.10.2.**" \
    r001
    > pyarmor obfuscate --with-license licenses/r001/license.lic foo.py
    > cd dist

    답글삭제
  5. ***** [Info] 한개의 py 파일만 obf 하는 방법 *****
    (Ref.) https://pyarmor.readthedocs.io/en/latest/advanced.html#run-bootstrap-code-in-plain-scripts


    (1) 아래 명령을 통해 pytransform_bootstrap 폴더 생성(하부에 여러 파일 생성)
    > pyarmor runtime -i
    이 폴더를 복사해서 anaconda 가상환경 아래(D:\Anaconda3\envs\py38\lib)로
    복사함(왜냐하면 "import pytransform_bootstrap"이 먹어야 하므로)

    (2) obf할 py가 있는 폴더로 가서 아래 명령으로 obf해 줌
    > pyarmor o --exact foo.py
    --exact 옵션은 foo.py 파일 딱 하나만 obf 해준다.

    (3) 현 폴더 아래에 dist/foo.py 파일과 dist/pytransform 폴더가 만들어 진다.
    foo.py와 pytransform폴더를 둘 다 복사해서 원래 foo.py가 있던 위치로 복사

    (4) foo.py 파일을 편집한다. 첫번째 라인 수정.
    from .pytransform import pyarmor_runtime
    pyarmor_runtime()

    (5) 마지막으로 foo.py파일을 호출해 사용할 py 파일로 가서 바로 앞부분에 추가

    import pytransform_bootstrap # 추가부
    import foo # 원래 있던 것

    답글삭제
    답글
    1. https://pyarmor.readthedocs.io/en/latest/man.html
      에 접속하면 Examples이 있음.

      삭제
    2. [pyarmor 적용]

      APIProject_obf/ 에서
      > pyarmor o --recursive --with-license licenses/r001/license.lic manage.py

      하위 모든 py파일이 난독화되는데, obf할 필요가 없는 일부 파일만 원본 파일을 복사해 주면 된다.
      특히 ***dist/reid/dnn/freeze/*** 내의 모든 파일은 원본에서 복사해 준다. 이것만 해주면 일단 실행은 된다.

      그런데, django에 관련된 일부 파일도 원본으로 복사해 준다.

      db.sqlite3 파일
      APIProject/, 모든 파일
      Prediction/, DNNConfig.py 제외한 모든 files과 folders
      sklearn/, 모든 파일
      users/, 모든 파일

      삭제

      삭제
    3. [정리]
      0. obf하고 싶은 파일이 있는 폴더로 이동
      1. pyarmor licenses --expired 2021-12-31 --bind-mac e0:d3:2e:b5:c8:01 r001
      2. pyarmor o --with-license licenses/r001/license.lic --wrap-mode=0 --obf-code=0 --exact core.py
      3. dist폴더에 생성된 core.py와 pytransform 폴더를 원 폴더로 복사
      4. core.py 첫라인 . 수정

      [참고사항] ray에 대해서는 obf-code=0 넣어야 함. numba jit는 wrap-mode=0넣어도 안되는듯

      삭제
  6. [사용자 등록]
    -요약: knox 사용으로 사용자 등록과 login, logout를 간단하게 처리함.
    -참고: https://studygyaan.com/django/django-rest-framework-tutorial-register-login-logout
    -설치:
    pip install djangorestframework
    pip install django-rest-knox

    -파일위치: D:\tmp\django\test0\mysite1
    -앱 재사용
    accounts 폴더 아래 모두 복사하여 사용 가능.
    이름을 accounts에서 다른 것으로 바꿀 경우, project인 mysite1/urls.py와 mysite1/settings.py에서 앱명을 수정.

    답글삭제
    답글
    1. [Debug기록]
      curl -u pashi:*****12345 -X POST -F
      file=@2.jpg http://164.125.***.***:****/api/upload/image/
      으로 업로드 요청 시, auth가 실패하여 업로드가 안됨.

      -https://stackoverflow.com/questions/53828599/how-to-authorize
      -django-rest-knox-login-path-without-401-error
      를 참조하여,
      - settings.py에 REST_FRAMEWORK에서
      'rest_framework.authentication.BasicAuthentication'
      를 추가하여 해결.

      삭제
  7. [POSTMan 사용 팁]

    1. d:\tmp\django\test0\mysite1에서 작업
    여기서 account생성, Login관리 등을 테스트한다.
    2. python manage.py runserver 실행
    3. Postman을 오픈
    - accounts/url.py를 보면 주소가 register/, login/, logout/ 등으로 주어져 있다. 따라서,
    Postman에서 주소를 localhost:8000/account/login/로 마지막에 꼭 "/"를 포함해서 넣어야 함.
    - 주소창에서 "+" 버턴을 눌러 명령별로 창을 열어야 자꾸 주소를 바꾸는 일 없이 사용이 편리

    4. 먼저 로긴을 하기 위해
    http://localhost:8000/account/login/, POST 사용.
    주소 끝에 /가 있음에 유의. Body의 raw에
    {
    "username":"pashi",
    "email":"",
    "password":"pashi12345"
    }
    입력하면
    {
    "expiry": "2021-05-13T17:38:07.008638Z",
    "token": "e5c1e4d5196eec17e9efe570b73b3b2cab8b423015a35bd7cf0879fe6b3be861"
    }
    리턴된다. Token을 복사한다.

    5. "+"를 눌러 새로 주소창을 열고
    localhost:8000/account/user/, GET 사용.
    주소 끝에 /가 있음을 유의. Header의 key부에 Au를 치면 Authorization이 나오는데, 이를 선택하고,
    value에는 Token e5c1e4d5196eec17e9efe570b73b3b2cab8b423015a35bd7cf0879fe6b3be861를 입력.
    {
    "id": 4,
    "username": "pashi",
    "email": ""
    }
    가 리턴되면서 Token으로 사용자가 존재함을 검정하였다.

    6. "+"를 눌러 또 주소창을 추가하고,
    localhost:8000/account/logout/, POST 사용.
    Header의 Authorization에 체크하고, value에
    Token e5c1e4d5196eec17e9efe570b73b3b2cab8b423015a35bd7cf0879fe6b3be861
    을 추가하고 Send하면,
    리턴 값은 없고, 정상적으로 Logout된다. 이제 이 Token은 무효화 되었다.
    다시 Login해서 token을 발급받아야 User 체크를 할 수 있다.

    답글삭제