flask template form
이 자습서에서는 Flask 템플릿, 양식,보기, 응답 및 리디렉션에 대해 설명합니다.
일반적으로 템플릿은 프로그래밍에서 텍스트의 일부를 다른 데이터로 재사용하는 데 사용됩니다. 웹 개발과 관련하여 디자이너는 템플릿을 사용하여 읽기 쉽고 읽기 쉬운 형식으로 데이터를 표시합니다.
템플릿 디자인은 일반적으로 인간 상호 작용으로 인한 복잡성으로 인해 언어 사용을 포함합니다.
=> Flask 초보자 가이드를 여기에서 살펴보십시오.
학습 내용 :
소개
Flask는 사용자의 상호 작용 수준에 따라 응용 프로그램의 동작을 표시하는 Jinja2라는 템플릿 엔진을 사용합니다. Jinja 템플릿은 변수, 표현식 및 태그를 사용합니다.
브라우저에서 페이지를 렌더링하기 전에 런타임 중에 변수와 표현식이 값으로 대체됩니다. Jinja 태그는 Flask 템플릿에서 논리 및 제어 문을 작성하는 데 도움이됩니다.
플라스크보기
Flask보기의 개념은 Model-View-Controller라고하는 널리 사용되는 웹 애플리케이션 디자인 패턴에서 파생되었습니다. 뷰는이 패러다임에서 상호 연결된 세 가지 요소 중 하나이며 애플리케이션 로직을 다룹니다. 보기는 사용자에게 정보를 표시합니다.
이전 튜토리얼에서는 Flask-Appbuilder의 BaseView 클래스를 서브 클래 싱하여 View를 설계했습니다. 이 튜토리얼의 다음 부분에서는 마지막 예제를 확장하고 뷰를 사용자 정의 할 수있는 방법을 제시합니다.
플라스크 템플릿
첫 번째 템플릿을 시작하고 작성하겠습니다. templates 디렉토리 아래에 hello.html이라는 파일을 만듭니다.
해당 파일에 다음 코드를 작성하고 저장하십시오.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %}
템플릿 For 루프
위의 Flask 템플릿에서 목록의 항목을 반복하기 위해 for 루프를 사용했습니다. 컨트롤러 또는 핸들러에서 인사말 값이 포함 된 목록을 템플릿에 전달했습니다. 템플릿 내에서 {{item}} 구문을 사용하여 각 항목에 액세스합니다.
템플릿 if 블록
또한 if 문 사용을 기록해 두십시오. 여기에서는 Morning에 대한 항목을 테스트하고 굵게 및 기울임 꼴로 만듭니다.
이제 Flask Forms의 개념에 대해 자세히 알아 보겠습니다.
플라스크 양식
템플릿의 가장 중요한 측면 중 하나는 사용자의 입력을 받아 해당 입력을 기반으로 백엔드 로직을 작성하는 것입니다. 양식을 만들어 보겠습니다.
Flask-Appbuilder SimpleFormView를 사용하여 양식을 렌더링합니다. 하지만 먼저 양식을 만들어 보겠습니다. 양식을 만드는 것 외에도 flask fab create-admin 명령을 사용하여 관리자를 만들어야합니다.
따라서 이후에 생성 된보기 및 양식을 로그인 한 사용자로 확인할 수 있도록 개발 서버를 시작하기 전에 명령을 사용하십시오. 관리자로 로그인하고 생성 된 뷰가 스크린 샷에 표시된대로 메뉴 아래에 표시되는지 계속 확인합니다.
관리자 생성
아래 명령을 사용하여 관리자를 만듭니다.
플라스크 팹 생성 관리자
관리자 자격 증명으로 로그인
- http : // localhost : 8080으로 이동 한 후 로그인을 클릭합니다.

- 이전 섹션에서 만든 관리자 자격 증명으로 로그인합니다.

- 내 양식 카테고리를 클릭하여보기에 액세스하십시오.

노트 : 탐색 모음에 표시된 기본 메뉴에보기를 추가 한 후에 만 마지막 단계를 수행 할 수 있습니다.
계속해서 양식 기반보기를 만들어 보겠습니다.
앱 디렉토리 아래에 forms.py라는 파일을 만들고 여기에 다음 코드를 작성합니다.
from wtforms import Form, StringField from wtforms.validators import DataRequired from flask_appbuilder.fieldwidgets import BS3TextFieldWidget from flask_appbuilder.forms import DynamicForm class GreetingsForm(DynamicForm): greeting1 = StringField(('Morning'), description = ('Your morning Greeting'), validators = (DataRequired()), widget = BS3TextFieldWidget()) greeting2 = StringField(('Afternoon'), description = ('Your Afternoon Greeting'), validators = (DataRequired()), widget = BS3TextFieldWidget()) greeting3 = StringField(('Evening'), description = ('Your Evening Greeting'), widget = BS3TextFieldWidget()) greeting4 = StringField(('Night'), description = ('Your Night Greeting'), widget = BS3TextFieldWidget())
Flask-Appbuilder에서 DynamicForm을 기반으로 양식을 만들었습니다. 네 개의 텍스트 필드가 있습니다. 우리는 인사의 모범을 보여줍니다. 4 개의 필드 중 2 개는 필수이고 2 개는 선택 사항입니다. 처음 2 개의 인사말에 대해 유효성 검사기 값을 언급했기 때문입니다.
이제이 양식에 대한보기를 만들어 보겠습니다. 다음 코드 줄을 views.py 파일에 작성합니다.
from flask import render_template, flash from flask_appbuilder import SimpleFormView from app.forms import GreetingsForm class GreetingsView(SimpleFormView): form = GreetingsForm form_title = 'This is a Greetings form' message = 'Your Greetings are submitted' def form_get(self, form): form.greeting1.data = 'Your Morning Greeting' form.greeting2.data = 'Your Afternoon Greeting' form.greeting3.data = 'Your Evening Greeting' form.greeting4.data = 'Your Night Greeting' def form_post(self, form): flash(self.message, 'info') greetings = ( form.greeting1.data, form.greeting2.data, form.greeting3.data, form.greeting4.data, ) session('greetings')=greetings return redirect(url_for('HelloWorld.hello_greetings2'))
위의보기에는 양식의 필드에 기본값을 채우고 브라우저에서 양식이 제출 된 후 입력 된 값을 읽는 form_get 및 form_post라는 두 가지 메소드가 있습니다.
GreetingsView는 아래 이미지와 같이 양식을 표시합니다.
또한 Flask 세션 객체를 사용하여 form_post에 필드 값을 저장하여 작성하려는 해당 새 뷰에서 동일한 값에 액세스 할 수 있습니다.
이제 HelloWorld 클래스를 수정하고 인사말을 표시하는 다른 메서드를 추가해 보겠습니다. hello_greetings2라고 부를 것입니다.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session('greetings') return render_template('hello.html', greetings=greetings)
이보기에서는 세션 개체의 값을 읽고 Flask 렌더링 템플릿을 사용하여 해당 값을 사용자 용 HTML에 표시합니다. hello_greetings2는 hello_greetings와 유사한 기능을 수행하는 또 다른 방법입니다.
유일한 차이점은 hello_greetings2를 사용하면 사용자가 입력 한 값을 표시하고 hello_greetings에서는 사용자로부터 입력을받지 않고 각 경로에 매핑 된보기를 작성하는 동안 하드 코딩했습니다.
플라스크 응답
코드에서 Flask 응답을 명시 적으로 사용하는 경우는 매우 드뭅니다. Flask의 Response 클래스는 Werkzueg의 Response 클래스에있는 Response 클래스의 하위 클래스 일 뿐이며 이는 ResponseBase 클래스를 하위 클래스로 만듭니다.
Flask Response 객체는 return 문이나 render_template과 같은 메서드를 호출 할 때마다 Flask에 의해 내부적으로 형성됩니다.
또한 아래 수정 된 HelloWorld 뷰에 표시된 것처럼 뷰에서 return 문의 일부로 필요한 경우 응답 코드 및 콘텐츠 유형을 사용자 지정할 수 있습니다.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session('greetings') return render_template('hello.json', greetings=greetings), 201, {'Content-Type' : 'application/json'
Flask의 Response 클래스를 직접 사용하는 것은 파일 크기 및 네트워크 대역폭의 제약으로 인해 한 번에 전체 콘텐츠를 반환하는 대신 콘텐츠를 스트리밍 할 때 사용 사례에서 다룰 수 있습니다.
큰 CSV에서 콘텐츠를 스트리밍하는 한 가지 예가 아래에 나와 있습니다.
from flask import Response @app.route('https://cdn.softwaretestinghelp.com/largefile.csv') def send_large_csv(): '''A controller to stream the content of a large csv file''' def gen(): for row in iter_all_rows(): yield ','.join(row) + '
' return Response(gen(), mimetype='text/csv')
플라스크 리디렉션
애플리케이션이 클라이언트의 다양한 요청을 기반으로 응답을 미리 정의하는 것이 항상 가능한 것은 아닙니다.
요청에 대한 응답으로 다른보기 또는 위치에서 이행 할 수있는 콘텐츠를 제공 할 수있는 시나리오에서 Flask 리디렉션을 사용합니다. 우리는 표준 HTTP 반환 코드와 함께 중단과 함께 Flask Redirect를 사용합니다.
예를 들면 아래 코드에서는 HTTP 코드 301로 리디렉션을 사용하고 401로 중단했습니다.
from flask import Flask, redirect, url_for, request, abort app = Flask(__name__) @app.route('/') def index(): return render_template('log_in.html') # Log In template @app.route('/login',methods = ('POST', 'GET')) def login(): if request.method == 'POST': if request.form('username') == 'admin' : # if user is admin return redirect(url_for('success')), 301 else: abort(401) # stop processing else: return redirect(url_for('index')) # redirect to another view
또한 Flask redirect 및 url_for를 사용하여 GreetingsView를 확인하여 세션 개체에 인사말 값을 저장하여 내부적으로 요청을 다른 뷰로 리디렉션합니다. Flask 리디렉션은 항상 기본값 또는 givens 상태 코드를 사용하여 애플리케이션의 다른 위치로 응답 객체를 반환합니다.
플라스크 디버그 도구 모음
지난 튜토리얼에서 Flask의 대화 형 디버거를 이미 소개했습니다. 이 자습서에서는 Flask 응용 프로그램의 디버깅을 더 쉽게 만들기 위해 한 단계 더 수행합니다. 일단 설치되면 Flask 디버그 도구 모음이 Flask 애플리케이션 위에 오버레이로 표시됩니다.
Flask 디버그 도구 모음을 설치합니다.
pip install flask-debugtoolbar
debugtoolbar를 활성화하려면 프로젝트에서 __init__.py 파일을 열고 다음 코드 줄을 추가하여 코드를 수정합니다.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Flask 디버그 도구 모음은 디버그 모드에서만 활성화됩니다. 활성화되면 애플리케이션을 다시로드 할 때 두 가지를 관찰하게됩니다.
#1) 디버그 도구 모음이 브라우저의 오른쪽에 나타납니다. 도구 모음에서 제공하는 다양한 기능을 보려면 클릭하고 확장하십시오.

#두) 새로운 POST 요청이 애플리케이션에 전송 될 때마다 툴바가이를 가로 채어 애플리케이션의 디버깅과 관련된 변수 및 기타 매개 변수를 검사 할 수 있습니다.

이 기본 인터셉트는 아래 구성으로 비활성화 할 수 있습니다.
app.config('DEBUG_TB_INTERCEPT_REDIRECTS') = False

이제 샘플 애플리케이션에 도입 한 추가 기능에 대한 뷰를 테스트하는 몇 가지 테스트를 작성해 보겠습니다.
유닉스에서 grep 명령 사용
테스트를 진행하기 전에 __init__.py에서 아래와 같이 디버깅을 비활성화하십시오. 또는 아래 줄을 주석 처리 할 수 있습니다.
app.debug = False
Flask 애플리케이션보기 테스트
더 관리하기 쉽게 테스트 코드를 구성해야합니다. 루트 디렉터리에 conftest.py라는 파일을 만들고 아래에 언급 된 줄을 test_hello.py에서이 파일로 이동합니다.
from app import appbuilder import pytest @pytest.fixture def client(): ''' A pytest fixture for test client ''' appbuilder.app.config('TESTING') = True with appbuilder.app.test_client() as client: yield client
pytest 조명기는 런타임에 pytest에 의해로드됩니다. 이 픽스쳐는 사용 가능하며 모든 테스트와 공유됩니다. pytest는 명시 적 PYTHONPATH를 지정하지 않고도 프로젝트의 모든 모듈을 인식 할 수 있으므로 모든 프로젝트의 루트 경로에 conftest.py를 정의하는 것이 모범 사례로 간주됩니다.
test_hello 파일에 대한 테스트를 하나 더 추가하십시오. 아래에 예제 테스트가 나와 있습니다. 클라이언트 개체의 get 메서드를 호출하고 resp.data에 저장된 응답 데이터에서 예상 값을 어설 션합니다.
마찬가지로 다양한 뷰를 가리키는 더 많은 테스트를 작성할 수 있습니다. 다음 튜토리얼에서 더 많은 테스트를 작성할 것입니다.
def test_greetings(client): ''' A test method to test view hello_greetings''' resp = client.get('/hello/greetings', follow_redirects=True) assert b'Good Morning' in resp.data
프로젝트의 루트 디렉터리에서 아래 명령어를 사용하여 테스트를 실행합니다.
pytest -v
테스트 실행은 아래와 같이 콘솔에 테스트 결과를 생성합니다.

아직 실패가 없습니다. 아래에 언급 된대로 테스트를 하나 더 설계 해 보겠습니다.
def test_greetings2(client): ''' A test method to test view hello_greetings2 ''' resp = client.get('/hello/greetings2', follow_redirects=True) assert b'Good Morning' in resp.data
이 테스트는 views.py 파일의 HelloWorld 클래스에 메시지 속성을 정의하지 않았기 때문에 실패합니다.
pytest -v를 사용하여 테스트를 실행하면 아래 표시된 이미지와 유사한 결과가 콘솔에 다시 표시됩니다.

아래 섹션에서는 CI / CD 플랫폼에서 테스트를 실행하는 동안 수행해야하는 단계를 설명합니다. 동일한 프로젝트에 Git 액션을 사용합니다.
Git 작업이있는 CI / CD
이제 파일의 모든 변경 사항을 저장하고이 자습서에 대한 메시지를 제공하여 커밋을 만듭니다. 로컬 저장소에서 커밋 한 후 –rebase 플래그를 사용하여 원격 원본에서 변경 사항을 가져와 원격의 새 변경 사항과 충돌이 있는지 확인합니다. 우리는 역사를 일관되게 유지하기 위해 리베이스합니다.
아래 명령을 사용하여 원격 원본에서 변경 사항을 가져오고 병합합니다. 그러나 원격에서 변경 사항을 가져 오기 전에 변경 사항을 커밋하십시오.
git pull origin master --rebase
이제 로컬 마스터 브랜치를 확인하고 tutorial-2 브랜치와 병합합니다. 병합이 성공하면 해당 변경 사항을 오리진의 마스터에 게시합니다. 이 작업은 대상 플랫폼에서 빌드를 호출합니다. 이 코드는 최신 Ubuntu의 Python3.7 및 Python 3.8에서 테스트하고 있습니다.
결론
이 자습서에서는 Flask 프레임 워크에서 템플릿이 작동하는 방식을 살펴 보았습니다. 변수와 표현식을 사용하여 사용자 정의 값으로 플라스크 템플릿을 만들고 렌더링하는 단계를 설명했습니다.
또한 Flask Appbuilder 플러그인의 미리 정의 된 뷰 BaseView의 예를 보았습니다. 이 뷰는 사용자 지정 뷰를 생성하기 위해 Flask 개발자가 쉽게 하위 클래스를 만들 수 있습니다.
지금까지 다룬 개념은 독자가 데이터베이스 백엔드없이 Flask를 사용하여 정적 및 동적 웹 사이트를 빠르게 만들 수 있도록 도와줍니다. Flask와 함께 데이터베이스 사용 개념을 살펴볼 때 다음 자습서에서 ModelView를 사용하여 데이터베이스에서 데이터를 읽고 쓰는 방법을 설명합니다.