flask design patterns
이 자습서에서는 예제를 사용하여 웹 애플리케이션을 디자인하는 동안 따라야 할 몇 가지 일반적인 Flask 디자인 패턴과 모범 사례를 설명합니다.
응용 프로그램 디자인은 소프트웨어 개발의 필수 요소입니다. 계획되지 않은 애플리케이션 설계는 극복 할 수없는 기술적 부채를 초래합니다. 따라서 애플리케이션을 확장 할 때마다 시간 테스트를 거친 디자인 패턴을 사용해 보는 것이 좋습니다.
Flask 커뮤니티에는 응용 프로그램에 대한 몇 가지 패턴을 시도 할 때 영감을주고 디자인 결정에 영향을 줄 수있는 많은 예제가 있습니다. Flask는 의견이없고 유연하기 때문에 기존 패턴의 개념을 결합하고 새 패턴을 만들고 싶을 수 있습니다.
학습 내용 :
플라스크 디자인 패턴
예를 들면 MVC 패턴에서 단일 페이지 애플리케이션, SAAS 패턴에 이르는 많은 예제를 찾을 수 있습니다. 디자인 패러다임의 이름을 지정하면 커뮤니티의 누군가가 이미 시도해 보았으며 자유롭게 사용해 볼 수 있습니다.
다음은 살펴볼만한 몇 가지 저장소입니다.
Flusk
Flusk는 SQLAlchemy, Docker 및 Nginx를 포함하는 대규모 Flask 애플리케이션을 만드는 데 사용할 수있는 예입니다. 백엔드, 도메인, 뷰 및 모델을 각각의 레이어로 생성하는 아름다운 논리 분리가 있습니다.
Flask Blueprints를 훌륭하게 사용하고 Factory 디자인 패턴을 따릅니다. Flusk에서 확장을 쉽게 만들 수 있으며 Docker를 사용하여 애플리케이션을 컨테이너화하는 것도 더 쉽습니다. 소스 코드 살펴보기 여기 .
Windows 10을위한 최고의 무료 DVD 리퍼
쿠키 커터 플라스크
Cookiecutter Flask는 자산 번들링 및 웹팩을 사용한 축소와 같은 기능이있는 플라스크 템플릿입니다. 사용자 등록 / 인증을위한 시작 템플릿이 있으며 Bootstrap 4를 기반으로합니다.
Cookiecutter는 Python 패키지 프로젝트를 생성하는 명령 줄 유틸리티입니다. 이 템플릿을 사용하면 Flask 애플리케이션도 PyPI로 게시 할 수 있습니다. 이 프로젝트는 활발히 개발 중입니다.
평가할 가치가 있습니다. 이 링크 .
플라스크 가득 참
Flask full은 Celery, MongoEngine, Signals, Shell 명령, WebSocket 및 eventlet을 사용하는 강력한 상용구입니다. Swagger API 문서 및 Sphinx 문서와 매우 잘 통합됩니다.
이 프로젝트를 소스로 평가하십시오. 자유롭게 사용할 수 있습니다 여기 .
Flasky
가벼운 응용 프로그램을 만드는 경우 Flasky를 고려할 수 있습니다. Flasky의 소스 코드를 사용할 수 있습니다. 여기 . 이 저장소는 25 년 이상의 웹 개발 경험을 보유한 Miguel Grinberg가 만들었습니다.
그는 그의 책에서 논의 된 개념에 대한 코드 예제를 제공하기 위해 Flasky를 만들었습니다. Flask 웹 개발 .
어떤 프레임 워크 또는 템플릿을 선택하든, 이들 모두는 몇 가지 표준 기능을 가지고 있으며 각각의 방식으로 설명합니다. 여기에서는 이러한 기능 중 일부를 나열하고 논의하고,이 튜토리얼 시리즈의 샘플 애플리케이션에서 Flask-Appbuilder를 사용하여 구현합니다.
이 튜토리얼은 오늘날 거의 모든 웹 애플리케이션에서 찾을 수 있고 웹 개발자의 키트에 있으면 좋은 몇 가지 일반적인 패턴에 대해 설명합니다.
Flask 로그인 예
웹 애플리케이션은 일반적으로 사용자가 할당 된 권한에 따라 애플리케이션의 제한된 부분에 등록하고 액세스해야합니다. 사용자에게는 권한 기반 역할이 있습니다. 예를 들면 공개 사용자는 다른 사용자를 만들 수있는 권한이 없습니다. 그러나 관리자에게는 이러한 권한이 있습니다.
때때로 웹 애플리케이션은 기본 또는 미리 정의 된 권한을 할당하여 사용자 등록 및 사용자 생성을 자동화합니다.
오프라인으로 사용자 만들기
flask fab create-user 명령을 사용하여를 사용하여 사용자를 생성 해 보겠습니다. 이 명령을 사용하면 사용자 계정의 세부 정보를 제공하는 명령 줄 프롬프트가 표시됩니다. 아래에 표시된 것과 유사한 세부 정보를 제공하면 사용자가 생성됩니다.
Role (Public): Username: user1 User first name: User1 User last name: Last1 Email: user1@sthwebsite.com Password: Repeat for confirmation: ## various logs 2020-06-21 13:55:01,053:INFO:flask_appbuilder.security.sqla.manager:Added user user1 User user1 created.
명령 출력이 끝나면 sqla.manager는 사용자 생성을위한 확인 메시지를 인쇄합니다.
이제 애플리케이션에 액세스하고 방금 입력 한 세부 정보로 로그인합니다. 프로덕션 데이터베이스에 사용자를 생성 한 경우 해당 세부 정보를이 계정을 생성 한 사람에게 전달합니다.
http : // localhost : 8080 / login으로 이동하면 아래와 같은 로그인 양식이 표시됩니다.
user1이 로그인하면 사용자는 환영 메시지를 볼 수 있습니다.
온라인으로 사용자 만들기
모든 사용자를 오프라인으로 생성하는 것은 불가능할 수 있습니다. 또한 프로덕션 환경에서 flask fab create-user 명령을 사용하려면 더 많은 기술 전문 지식이 필요할 수 있습니다. 대부분의 경우 사용자 생성 작업을 담당하는 관리자로부터 일부 워크로드를 제거해야 할 수 있습니다.
따라서 예제 웹 애플리케이션에서는 사용자가 스스로 등록 할 수 있도록하겠습니다.
Google의 reCAPTCHA 서비스를 사용하여 악의적 인 행위자가 애플리케이션의 제한된 부분에 액세스하는 것을 방지합니다.
먼저 Google의 reCAPTCHA 서비스에 도메인을 등록하고 SITE 키와 SECRET 키를 획득하겠습니다.
1 단계: 아래 명령을 사용하여 Flask-Mail을 설치합니다.
pip install Flask-Mail
https://www.google.com/recaptcha/intro/v3.html로 이동하고 Google 계정을 사용하여 관리자로 로그인합니다.
2 단계: reCaptcha 유형을 선택하십시오.
3 단계 : Google의 reCaptcha를 사용할 도메인을 제공합니다.
또한이 키에 대해 허용 된 도메인 목록에 localhost를 추가하고 약관에 동의하고 제출합니다. 이 기능을 개발 한 후 나중에 제거 할 수 있습니다.
4 단계 : 공개 키라고도하는 사이트 키를 적어 둡니다.
5 단계 : 개인 키라고도하는 SECRET KEY를 적어 둡니다.
위에서 언급 한대로 키를 적어두면 구성에서 참조하고 읽을 수있는 위치에 저장하는 것이 가장 좋습니다. 이 자습서에서는 값을 SITE_KEY 및 SECRET_KEY로 환경 변수로 저장했습니다.
이제 config.py를 열고 아래와 같이 업데이트하십시오.
# Will allow user self registration AUTH_USER_REGISTRATION = True# The default user self registration role AUTH_USER_REGISTRATION_ROLE = 'Public'# Config for Flask-WTF Recaptcha necessary for user registration RECAPTCHA_PUBLIC_KEY = os.environ.get('SITE_KEY', None) RECAPTCHA_PRIVATE_KEY = os.environ.get('SECRET_KEY', None) # Config for Flask-Mail necessary for user registration MAIL_PORT = 587 MAIL_USE_SSL = False MAIL_SERVER = 'smtp.gmail.com' MAIL_USE_TLS = True MAIL_USERNAME = 'sthtestmail@gmail.com' MAIL_PASSWORD = 'Passw0rdqwerty' MAIL_DEFAULT_SENDER = 'sthtestmail0@gmail.com'
Google 계정에 대한 보안 수준이 낮은 액세스를 활성화해야 할 수 있습니다. 이메일 관련 문제가 발생하면 아래 URL에서 계정 액세스를 활성화하십시오.
- https://accounts.google.com/DisplayUnlockCaptcha
- https://support.google.com/mail/?p=BadCredentials
이제 로그인 페이지에서 추가 사용자 등록 버튼을 볼 수 있습니다. 등록을 클릭하면 reCaptcha Challenge와 함께 많은 필드를 볼 수 있습니다.
이메일로 등록하고 reCaptcha 챌린지를 통과하면 아래와 같이 확인 메시지가 표시됩니다.
등록시 제공 한 이메일이 유효한 경우 아래 이미지에 표시된 것과 유사한 계정 활성화 이메일을 받게됩니다.
Flask 관리자
이 Flask 자습서 시리즈의 다른 자습서를 읽은 경우 Flask-Appbuilder와 함께 제공되는 내장 보안의 이점을 활용했음을 알 수 있습니다. add_view_no_menu를 사용하여 추가 한보기는 보호되지 않습니다. 그러나 데이터 모델을 기반으로 추가 한 뷰는 Admin 사용자에 대해 자동으로 보호됩니다.
또는 대부분 유사한 결과를 얻을 수있는 Flask-Admin을 사용할 수 있습니다. Flask-Admin도 객체 지향 방식으로 뷰를 정의하겠습니다. 프런트 엔드의 웹 페이지는 인터페이스에 명시 적으로 추가 한 뷰 클래스의 메서드를 나타냅니다.
이 자습서에서는 Flask-Admin을 사용하지 않습니다. 대신, 우리는 더 빠른 속도로 동일한 결과를 달성하고 로그인, 인증, 역할 및 권한에 대한 보안 구축에 대해 알아야 할 필요성을 건너 뛰는 길을 택합니다. Flask-Appbuilder를 사용했기 때문에 가능했습니다.
Flask-Appbuilder와 Flask-Admin 모두 장단점이 있습니다. Flask-Admin의 경우 기존 보안 가정이 없음을 알아야하며 보안 모델을 기반으로 앱을 만들 수 있습니다. Flask-Admin에 대해 자세히 알아 보려면 다음을 방문하십시오. 여기 적절한 예를 살펴보십시오.
Flask 파일 업로드
요즘 거의 모든 웹 애플리케이션에는 파일을 저장하고 제공해야하는 요구 사항이 있습니다. 이들에 대한 일반적인 패턴은 저장된 파일에 대한 작업을 수행하고 애플리케이션 모델 및보기에 유지하기위한 일부 정보와 함께 서버의 경로에 파일을 저장하는 것입니다.
비슷한 예를 들어 보겠습니다. 추가 기능으로 노래 모델을 수정 해 보겠습니다.
models.py 파일에 다음 코드를 입력하십시오.
from flask import Markup, url_for from flask_appbuilder.models.mixins import FileColumn from flask_appbuilder.filemanager import get_file_original_name from flask_appbuilder import Model from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship class Song(Model): id = Column(Integer, primary_key=True) title = Column(String(200), nullable=False) rating = Column(Integer) album_id = Column(Integer, ForeignKey('album.id')) # for storing MP3 file of the song song_file = Column(FileColumn, nullable=False) album = relationship('Album') def __str__(self): return self.title def download(self): return Markup( ' Download ' ) def file_name(self): return get_file_original_name(str(self.song_file))
FileColumn 유형의 새 열을 추가하여 이전에 만든 Song 모델을 수정했습니다. 또한 SongsView에 추가 할 열을 두 개 더 추가하여 파일 이름과 업로드 된 파일을 다운로드 할 수있는 링크를 표시합니다.
Flask url_for 메서드는 마크 업과 함께 다운로드를 링크로 표시하는 데 사용되었습니다. 또한 동일한 파일 이름 간의 충돌을 피하기 위해 UUID와 연결하여 파일 이름이 저장되므로 Flask-Appbuilder의 get_file_original_name 메서드를 사용했습니다.
아래 주어진 코드로 views.py를 수정하여 해당 SongsView를 업데이트하십시오.
class SongsView(ModelView): datamodel = SQLAInterface(Song) label_columns = {'file_name' : 'File Name', 'download': 'Download'} list_columns = ('title', 'file_name', 'download') show_columns = ('title', 'file_name', 'download')
SongsView 클래스에서 표시해야하는 새 레이블을 언급했으며 지정된 목록에 언급 된 열만 나열하려고합니다.
여기에서 모델에 열을 추가하여 데이터베이스 모델을 수정했음을 기억해야합니다. 데이터베이스의 해당 테이블에는이 새 열이 없습니다. 따라서 마지막 튜토리얼 이후 SQLite 데이터베이스에서 작업하고 있으므로 app.db 파일을 제거합니다.
또는 flask db migrate 명령을 사용하여 필요한 버전 파일을 변경하고 flask db upgrade를 사용하여 테이블을 업데이트 할 수도 있습니다. 그러나 우리가 도입 한 변경 사항은 미미하며 애플리케이션 데이터베이스와 사용자를 다시 만들 수 있습니다.
프로덕션에서는 애플리케이션의 데이터베이스 스키마를 변경할 때마다 Flask-Migrate 명령을 사용하는 것이 좋습니다.
아래 명령을 사용하여 데이터베이스 파일을 제거하고 관리자를 다시 만듭니다.
rm app.db flask fab create-db flask fab create-admin
이제 관리자 자격 증명으로 응용 프로그램에 로그인하면 아래 이미지와 같이 수정 된 SongsView가 표시됩니다.
파일과 함께 노래를 추가합니다.
파일을 저장하면보기의 열이 아래와 같이 표시됩니다.
config.py에서 다음 값을 확인하십시오. 업로드 된 파일은 서버의이 경로에 저장됩니다. 이 자습서에서는이 샘플 응용 프로그램을 개발중인 시스템에 업로드됩니다.
config.py에 언급 된대로 업로드 경로를 확인하십시오. 파일은 아래와 같이 UUID와 함께 저장됩니다.
Flask HTTPS
개발에 관한 한 HTTPS없이 실행되는 Flask 애플리케이션을 계속 실행할 수 있습니다. 보안 관점에서 HTTPS는 합법적 인 클라이언트와 서버간에 통신이 이루어 지도록합니다.
이 암호화 된 통신을 위해서는 한 쌍의 공개 및 개인 키와 함께 CA 서명 인증서를 사용하여 클라이언트와 서버간에 신뢰가 설정되어야합니다. 그것에 대해 더 읽어보십시오 여기
Windows 10 용 무료 비디오 변환기 소프트웨어
이 튜토리얼에서는 개발 중에 HTTP를 사용하여 Flask 기반 웹 사이트를 개발하는 방법을 알려드립니다.
개발 중에 HTTPS를 포함하는 가장 빠르고 쉬운 방법은 아래 run.py에서 언급 한대로 임시 ssl_context를 사용하는 것입니다. 그러나 환경에서 pip를 사용하여 pyopenssl을 설치하십시오.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context='adhoc')
ssl_context를 추가 한 후 https : // localhost : 8080 /으로 이동하면이 통신에 사용되는 인증서의 유효성에 대한 의심을 제기하는 경고가 표시됩니다. 또한 http : // localhost : 8080 / 탐색은 더 이상 작동하지 않습니다.
따라서이 접근 방식은 약간 번거롭고 개발 서버를 다시 시작할 때마다이 요청을 계속 수락해야합니다.
아래와 같이 작업을 계속하려면 안전하지 않은 액세스를 클릭해야합니다.
또는 https 기능을 사용하여 개발하기 위해 Python Tuple의 인증서 및 키 경로를 run 메서드의 ssl_context 매개 변수에 전달할 수 있습니다. 그러나이 접근 방식을 채택하려면 아래 명령을 사용하여 자체 서명 된 인증서와 키를 생성해야합니다.
openssl req -x509 -newkey rsa:4096 -nodes -out mycert.pem -keyout mykey.pem -days 365
요청 된 쿼리에 적절한 값을 제공하십시오.
모든 기본값은 그대로 두었습니다. 이제 개발 서버를 중지하고 아래와 같이 경로 인증서와 키 경로를 전달합니다.
app.run(host='0.0.0.0', port=8080, debug=True, ssl_context=('mycert.pem', 'mykey.pem'))
이 접근 방식은 Adhoc ssl_context를 사용하는 이전 방법과도 유사합니다. 그러나이 경우 세부 정보가 더 오래 지속됩니다. 365 일을 언급했습니다. 필요한 날짜로 만료를 지정할 수 있습니다. 또한 팀에서 개발중인 경우 이러한 파일을 다른 팀 구성원과 공유 할 수 있습니다.
프로덕션 환경에서 인증서는 CA에서 발급하고 Miguel Grinberg는 몇 가지 사용 사례에 대해 설명합니다. 여기 . 해당 페이지에서 자세한 내용을 읽어 보는 것이 좋습니다.
결론
이 자습서에서는 Flask 로그인, Flask 관리자, Flask 파일 업로드 및 Flask HTTPS와 관련된 기능을 개발하는 동안 웹 개발자가 따르는 몇 가지 패턴에 대해 설명했습니다. 우리는 코드 예제를 제공했으며 독자들도 그것을 시도 할 수 있습니다.
다음 자습서에서는 Flask 확장 개념을 다루고 REST API 기반 기능을 만드는 방법을 살펴 봅니다. 또한 Flask 내에서 Twitter API를 사용하는 방법에 대해 설명합니다.
추천 도서
- 자바의 디자인 패턴 : 싱글 톤, 팩토리 및 빌더
- Python Flask 자습서-초보자를위한 Flask 소개
- 예제가 포함 된 Flask API 자습서 | API로 Flask 확장
- Blueprint 및 Bootstrap이있는 Flask 앱 및 Flask 프로젝트 레이아웃
- Django 대 Flask 대 노드 : 선택할 프레임 워크
- 답변이있는 인기있는 Python Flask 인터뷰 질문 31 가지
- 복잡한 데이터 모델을 구축하기위한 10 가지 데이터베이스 설계 도구
- 11 가지 UI / UX 디자인 트렌드 : 2021 년 이후에 기대할 사항