(1) OneQ 웹 프레임워크 Django(python) 개념 정리
- 프레임워크: lib는 사용자가 호출. framework는 framework이 사용자 코드를 호출
(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
[유용한 library]
답글삭제https://pypi.org/project/drf-api-logger/
[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. 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)로 접속하면 장고서버로 접속 된다.
[DEBUG=False, static 깨지는 것]
삭제> python manage.py runserver 192.168.0.7:8000 --insecure
(참고) https://www.inflearn.com/questions/16481
[models-serializers-views-urls 연결되는 코드 이해]
답글삭제https://pypi.org/project/django-easy-drf/
> 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
***** [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 # 원래 있던 것
https://pyarmor.readthedocs.io/en/latest/man.html
삭제에 접속하면 Examples이 있음.
[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/, 모든 파일
삭제
[정리]
삭제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넣어도 안되는듯
[사용자 등록]
답글삭제-요약: 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에서 앱명을 수정.
[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'
를 추가하여 해결.
[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 체크를 할 수 있다.