Flask(웹 어플리케이션)과 Nginx(웹 서버)를 uWSGI(WSGI 인터페이스)를 이용하여 서로 연결하여 서비스를 할 수 있습니다.

 

WSGI(Web Server Gateway Interface)

- 웹서버와 웹 어플리케이션이 어떤 방식으로 통신하는가에 관한 인터페이스를 의미

- 웹서버와 웹어플리케이션 간의 소통을 정의해 어플리케이션과 서버가 독립적으로 운영될 수 있게 돕는다.

- WSGI 어플리케이션은 uWSGI라는 컨테이너에 담아 어플리케이션을 실행하게 되며, uWSGI가 각각의 웹서버와 소통하도록 설정하면 끝이다. Flask, django와 같은 프레임워크는 이미 WSGI 표준을 따르고 있기 때문에 바로 웹서버에 연결해 사용할 수 있다.

- WSGI는 파이썬 표준이며, 서버에서 들어온 요청에 맞춰서 파이썬 웹 어플리케이션에 미리 등록된 로직을 콜백 함수로 서버에 응답해줍니다. 여기서 WSGI 인터페이스에 맞춰서 제작된 프레임워크가 uWSGI입니다.

 

오래된 uwsgi를 삭제한다.
mv /usr/bin/uwsgi /usr/bin/uwsgi-old
 
새롭게 uwsgi를 설치해준다.
pip install uwsgi
ln -s /usr/local/bin/uwsgi /usr/bin/uwsgi

uwsgi로 해당 어플리케이션을 실행한다.
uwsgi -s /tmp/uwsgi.sock --module yourapplication --callable app --venv .venv


파라미터를 매번 입력하기 번거로우므로 다음과 같으 ini파일을 작성해 저장해 놓고 실행 할 수 있다.
[uwsgi]
chdir=/home/ubuntu/helloWorld
chmod-socket=666
callable=app
module=app
socket=/tmp/uwsgi.sock
virtualenv=/home/ubuntu/helloWorld/.venv


윗 처럼 작성한 후 다음 명령어로 실행한다.
 uwsgi <filename> &
 
 https://edykim.com/ko/post/connecting-flask-uwsgi-to-nginx/(출처)

nginx

- nginx는 기존의 apache같은 웹 서버입니다. 기존 apache 서버와 다른 점은 nginx 는 비동기 이벤트 기반으로 만들어졌고, apache 서버는 동기식, 프로세스 또는 쓰레드 기반으로 만들어졌습니다.
apache서버에 비해서메모리를 적게가져간다는 장점이 있습니다.

apt-get을 통해 설치
apt-get install nginx-full

/etc/nginx/sites-available/default 파일을 열어 설정을 해준다.
server {
        listen   8080;

        server_name helloworld.haruair.com;

        location / {
                try_files $uri @helloworld;
        }

        location @helloworld {
                include uwsgi_params;
                uwsgi_pass unix:/tmp/uwsgi.sock;
        }
}

위 설정을 통해 nginx로 들어오는 모든 요청을 uWSGI로 보내고 
또 돌려받아 nginx를 통해 클라이언트에 전달하게 된다. nginx를 재구동하면 적용된다.
/etc/init.d/nginx restart

https://medium.com/sunhyoups-story/flask-nginx-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95-258b979d2de3

 

Flask + Nginx 설치 방법

Flask와 Nginx를 uWSGI를 이용하여 연결해봅시다

medium.com

차이점 Apache vs Nginx

https://youngmind.tistory.com/entry/Apache-vs-Nginx

 

Apache vs Nginx

Apache vs Nginx  Apache와 Nginx는 현재까지 가장 폭넓게 사용되는 2가지의 오픈소스 웹서버이다. 2가지 솔루션들은 현재 전체 웹서비스의 50% 이상을 차지할 정도로 프론트엔드에서 사랑받고 있다. 이�

youngmind.tistory.com

정적 컨텐츠와 동적 컨텐츠의 차이점은 무엇입니까

https://presmarymethuen.org/ko/dictionary/what-is-the-difference-between-static-and-dynamic-content/

 

정적 컨텐츠와 동적 컨텐츠의 차이점은 무엇입니까

집 / 질문 / 정적 컨텐츠와 동적 컨텐츠의 차이점은 무엇입니까 정적 컨텐츠와 동적 컨텐츠의 차이점은 무엇입니까 대답 1: 정적 콘텐츠는 사이트를 방문하는 모든 사람에게 동일한 콘텐츠입니��

presmarymethuen.org

 

sqlarchemy

- Python의 객체에 데이터 모델을 정의하고 이를 데이터베이스와 매핑해주는 것을 ORM(Object Relaition Model)이라고 합니다. 덕분에 코드는 특정 데이터베이스에 종속되지 않고, 기본 객체 만으로 데이터를 기술할 수 있기 때문에 조금 더 OOP 스러운 코드를 작성할 수 있습니다.

Python에서 ORM으로 많이 쓰이는 것 중 SQLAlchemy가 있는데, 이를 Flask에서 플러그인 처럼 사용하기 쉽게 만들어진 Flask-SQLALchemy가 있습니다.

패키지 설치
(venv) PS flask_blog> pip install flask_sqlalchemy

https://opentutorials.org/module/3669/22070

 

데이터베이스 - Flask로 만드는 블로그

이전 시간에 우리는 부트스트랩을 이용해서 어플리케이션의 디자인을 조금 세련되게 변경했습니다. 이번에는 사용자와 게시물에 대한 정보를 저장하기 위한 데이터베이스를 만들어보도록 하��

opentutorials.org

 

https://translate.google.com/translate?hl=ko&sl=en&u=https://flask-login.readthedocs.io/en/latest/&prev=search&pto=aueflask-login.readthedocs.io/en/latest/

 

Flask-Login — Flask-Login 0.4.1 documentation

Flask-Login Flask-Login provides user session management for Flask. It handles the common tasks of logging in, logging out, and remembering your users’ sessions over extended periods of time. It will: Store the active user’s ID in the session, and let

flask-login.readthedocs.io

플라스크 로그인 

Flask-Login은 Flask에 대한 사용자 세션 관리를 제공합니다. 오랜 시간 동안 로그인, 로그 아웃 및 사용자 세션 기억과 같은 일반적인 작업을 처리합니다.

그것은 :

  • 활성 사용자의 ID를 세션에 저장하고 쉽게 로그인 및 로그 아웃 할 수 있습니다.
  • 보기를 로그인 한 (또는 로그 아웃 한) 사용자로 제한 할 수 있습니다.
  • 일반적으로 까다로운 "기억하기"기능을 처리하십시오.
  • 쿠키 도둑이 사용자의 세션을 도난 당하지 않도록 보호합니다.
  • Flask-Principal 또는 다른 인증 확장 프로그램과 나중에 통합 할 수 있습니다.

그러나 다음과 같은 것은 아닙니다.

  • 특정 데이터베이스 나 다른 저장 방법을 사용하십시오. 사용자로드 방법에 대한 책임은 전적으로 귀하에게 있습니다.
  • 사용자 이름과 비밀번호, OpenID 또는 기타 인증 방법을 사용하도록 제한하십시오.
  • "로그인 여부"이외의 권한을 처리합니다.
  • 사용자 등록 또는 계정 복구를 처리합니다.

설치 

pip를 사용하여 확장을 설치하십시오.

$ pip install flask-login

귀하의 응용 프로그램 구성 

Flask-Login을 사용하는 응용 프로그램에서 가장 중요한 부분은 LoginManager클래스입니다. 다음과 같이 코드 어딘가에 응용 프로그램 용으로 하나를 만들어야합니다.

login_manager = LoginManager()

로그인 관리자에는 ID에서 사용자를로드하는 방법, 로그인해야 할 때 사용자를 보내는 위치 등과 같이 응용 프로그램과 Flask-Login이 함께 작동하도록하는 코드가 포함되어 있습니다.

실제 응용 프로그램 객체가 생성되면 다음을 사용하여 로그인하도록 구성 할 수 있습니다.

login_manager.init_app(app)

기본적으로 Flask-Login은 인증에 세션을 사용합니다. 즉, 응용 프로그램에서 비밀 키를 설정해야합니다. 그렇지 않으면 Flask가이를 알리는 오류 메시지를 표시합니다. 비밀 키를 설정하는 방법 은 세션  Flask 설명서 를 참조하십시오.

경고 : “좋은 비밀 키를 생성하는 방법”섹션에서 제공된 명령을 사용하여 자신의 비밀 키를 생성하십시오. 예제를 사용하지 마십시오.

그것이 작동하는 방법 

user_loader콜백 을 제공해야합니다 . 이 콜백은 세션에 저장된 사용자 ID에서 사용자 객체를 다시로드하는 데 사용됩니다. unicode사용자  ID를 가져와 해당 사용자 개체를 반환해야합니다. 예를 들면 다음과 같습니다.

@login_manager.user_loader def load_user(user_id): return User.get(user_id)

이것은 반환한다 None( 예외를 발생시키지 ID가 유효하지 않은 경우). 이 경우 세션에서 ID가 수동으로 제거되고 처리가 계속됩니다.

사용자 클래스 

사용자를 나타내는 데 사용하는 클래스는 다음 속성 및 메서드를 구현해야합니다.

is_authenticatedTrue사용자가 인증 된 경우, 즉 유효한 자격 증명을 제공 한 경우이 속성이 반환되어야합니다 . 인증 된 사용자 만의 기준을 충족합니다 login_required.is_active이 속성은 True활성 사용자 인 경우 인증되는 것 외에도 계정을 활성화했거나 일시 중지하지 않았거나 응용 프로그램이 계정을 거부 한 조건을 반환해야 합니다. 비활성 계정은 로그인 할 수 없습니다 (물론 강제로).is_anonymousTrue익명 사용자 인 경우이 속성이 반환되어야합니다 . (실제 사용자는 False대신 돌아와야 합니다.)get_id()이 메소드는 unicode이 사용자를 고유하게 식별하는 user_loader 콜백을 반환해야 하며 콜백 에서 사용자를로드하는 데 사용할 수 있습니다 . 참고이이 것을 해야한다  unicode- ID가 기본적 인 경우 int또는 다른 유형, 당신은으로 변환해야합니다 unicode.

사용자 클래스 구현을보다 쉽게하기 위해 from을 상속하면 UserMixin이러한 모든 속성 및 메서드에 대한 기본 구현이 제공됩니다. (필요하지는 않습니다.)

로그인 예 

사용자가 인증되면 login_user 기능 을 사용하여 로그인합니다 .

예를 들면 다음과 같습니다.

@app.route('/login', methods=['GET', 'POST']) def login(): # Here we use a class of some kind to represent and validate our # client-side form data. For example, WTForms is a library that will # handle this for us, and we use a custom LoginForm to validate. form = LoginForm() if form.validate_on_submit(): # Login and validate the user. # user should be an instance of your `User` class login_user(user) flask.flash('Logged in successfully.') next = flask.request.args.get('next') # is_safe_url should check if the url is safe for redirects. # See http://flask.pocoo.org/snippets/62/ for an example. if not is_safe_url(next): return flask.abort(400) return flask.redirect(next or flask.url_for('index')) return flask.render_template('login.html', form=form)

경고 : 반드시 next매개 변수 값을 확인해야합니다 . 그렇지 않으면 응용 프로그램이 열린 리디렉션에 취약합니다. 구현 예는 이 Flask Snippet  is_safe_url참조하십시오 .

그렇게 간단합니다. 그런 다음 current_user모든 템플릿에서 사용할 수 있는 프록시 를 사용하여 로그인 한 사용자에게 액세스 할 수 있습니다 .

{% if current_user.is_authenticated %} Hi {{ current_user.name }}! {% endif %}

사용자가 로그인해야하는 뷰는 login_required데코레이터 로 장식 할 수 있습니다 .

@app.route("/settings") @login_required def settings(): pass

사용자가 로그 아웃 할 준비가되면 :

@app.route("/logout") @login_required def logout(): logout_user() return redirect(somewhere)

로그 아웃되고 세션에 대한 쿠키가 정리됩니다.

로그인 프로세스를 정의 

기본적으로 사용자 login_required가 로그인하지 않고보기 에 액세스하려고하면 Flask-Login이 메시지를 깜박이고 로그인보기로 리디렉션합니다. (로그인보기가 설정되어 있지 않으면 401 오류와 함께 중단됩니다.)

로그인보기의 이름은로 설정할 수 있습니다 LoginManager.login_view. 예를 들면 다음과 같습니다.

login_manager.login_view = "users.login"

깜박이는 기본 메시지는 메시지 를 사용자 정의하려면 다음을 설정하십시오 .Please log in to access this page.LoginManager.login_message

login_manager.login_message = u"Bonvolu ensaluti por uzi tiun paĝon."

메시지 카테고리를 사용자 정의하려면 LoginManager.login_message_category다음을 설정하십시오 .

login_manager.login_message_category = "info"

로그인보기가 경로 재 지정 될 next때 사용자가 액세스하려고하는 페이지 인 조회 문자열에 변수가 있습니다. 경우 또는 USE_SESSION_FOR_NEXT이다 True페이지는 키 아래 세션에 저장됩니다 next.

프로세스를 추가로 사용자 정의하려면 LoginManager.unauthorized_handler다음을 사용 하여 함수를 장식하십시오 .

@login_manager.unauthorized_handler def unauthorized(): # do stuff return a_response

인증 헤더를 사용하여 로그인 

주의

이 방법은 더 이상 사용되지 않습니다. request_loader 대신 아래를 사용하십시오 .

때로는 Authorization API 요청과 같은 헤더를 사용하여 기본 인증 로그인을 지원하려고 합니다. 헤더를 통한 로그인을 지원하려면 header_loader콜백 을 제공해야합니다 . 이 콜백은 user_loader사용자 ID 대신 헤더 값을 허용한다는 점을 제외하면 콜백 과 동일하게 작동해야합니다 . 예를 들면 다음과 같습니다.

@login_manager.header_loader def load_user_from_header(header_val): header_val = header_val.replace('Basic ', '', 1) try: header_val = base64.b64decode(header_val) except TypeError: pass return User.query.filter_by(api_key=header_val).first()

기본적으로 Authorization헤더 값은 header_loader콜백으로 전달됩니다 . AUTH_HEADER_NAME구성에 사용 된 헤더를 변경할 수 있습니다 .

요청 로더를 사용한 사용자 정의 로그인 

때로는 헤더 값이나 쿼리 인수로 전달 된 API 키와 같은 쿠키를 사용하지 않고 사용자를 로그인하려고합니다. 이 경우 request_loader콜백을 사용해야합니다 . 이 콜백은 user_loaderuser_id 대신 플라스크 요청을 수락한다는 점을 제외하면 콜백 과 동일하게 작동해야합니다 .

예를 들어, Authorization헤더를 사용하여 URL 인수와 기본 인증 모두에서 로그인을 지원하려면 다음을 수행하십시오.

@login_manager.request_loader def load_user_from_request(request): # first, try to login using the api_key url arg api_key = request.args.get('api_key') if api_key: user = User.query.filter_by(api_key=api_key).first() if user: return user # next, try to login using Basic Auth api_key = request.headers.get('Authorization') if api_key: api_key = api_key.replace('Basic ', '', 1) try: api_key = base64.b64decode(api_key) except TypeError: pass user = User.query.filter_by(api_key=api_key).first() if user: return user # finally, return None if both methods did not login the user return None

익명 사용자 

기본적으로 사용자가 실제로 로그인하지 않은 current_user경우 AnonymousUserMixin객체 로 설정됩니다 . 다음과 같은 속성과 방법이 있습니다.

  • is_active하고 is_authenticated있습니다False
  • is_anonymous 이다 True
  • get_id() 보고 None

익명 사용자에 대한 사용자 정의 요구 사항이있는 경우 (예 : 권한 필드가 필요함) 익명 사용자를 작성하는 호출 가능 (클래스 또는 팩토리 기능)을 제공 할 수 있습니다 LoginManager.

login_manager.anonymous_user = MyAnonymousUser

나를 기억 

기본적으로 사용자가 브라우저를 닫으면 플라스크 세션이 삭제되고 사용자가 로그 아웃됩니다. "Remember Me"는 사용자가 브라우저를 닫을 때 실수로 로그 아웃되는 것을 방지합니다. 이것은 사용자가 로그 아웃 한 후 로그인 양식으로 사용자의 사용자 이름 또는 비밀번호를 기억하거나 미리 채우는 것을 의미 하지는 않습니다 .

“Remember Me”기능은 구현하기 까다로울 수 있습니다. 그러나, 플라스크 - 로그인은 거의 투명하게 - 그냥 통과 remember=True받는 login_user 전화. 쿠키는 사용자의 컴퓨터에 저장되며, Flask-Login은 해당 쿠키가 세션에없는 경우 해당 쿠키에서 자동으로 사용자 ID를 복원합니다. 쿠키가 만료되기까지의 시간은 REMEMBER_COOKIE_DURATION구성으로 설정하거나에 전달할 수 있습니다 login_user. 쿠키는 변조 방지 기능이므로 사용자가 쿠키를 변조 (예 : 다른 사람의 사용자 ID를 자신의 위치에 삽입)하는 경우 쿠키가 존재하지 않는 것처럼 쿠키가 거부됩니다.

이 수준의 기능은 자동으로 처리됩니다. 그러나 애플리케이션이 중요한 데이터를 처리하는 경우 추가 인프라를 제공하여 기억 쿠키의 보안을 강화할 수 있습니다.

대체 토큰 

사용자 토큰을 기억 토큰의 값으로 사용한다는 것은 로그인 세션을 무효화하기 위해 사용자의 ID를 변경해야한다는 것을 의미합니다. 이를 개선하는 한 가지 방법은 사용자 ID 대신 다른 사용자 ID를 사용하는 것입니다. 예를 들면 다음과 같습니다.

@login_manager.user_loader def load_user(user_id): return User.query.filter_by(alternative_id=user_id).first()

그런 다음 get_idUser 클래스  메소드는 사용자의 기본 ID 대신 대체 ID를 반환합니다.

def get_id(self): return unicode(self.alternative_id)

이렇게하면 사용자가 비밀번호를 변경할 때 사용자의 대체 ID를 임의로 생성 된 새 값으로 자유롭게 변경할 수 있으므로 이전 인증 세션이 유효하지 않게됩니다. 대체 ID는 여전히 사용자를 고유하게 식별해야합니다. 두 번째 사용자 ID로 생각하십시오.

새로운 로그인 

사용자가 로그인하면 해당 세션이 "새로 고침"으로 표시되어 실제로 해당 세션에서 인증되었음을 나타냅니다. 세션이 삭제되고 "기억하기"쿠키로 다시 로그인하면 "비 신규"로 표시됩니다. login_required신선도를 구분하지 않으므로 대부분의 페이지에 적합합니다. 그러나 개인 정보 변경과 같은 민감한 조치에는 새로 로그인해야합니다. (비밀번호 변경과 같은 작업은 항상 비밀번호를 다시 입력해야합니다.)

fresh_login_required, 사용자가 로그인했는지 확인하는 것 외에도 로그인이 최신인지 확인합니다. 그렇지 않은 경우 자격 증명을 다시 입력 할 수있는 페이지로 보냅니다. 당신은 사용자 정의 할 수와 같은 방법으로 동작을 사용자 정의 할 수 있습니다 login_required설정에 의해, LoginManager.refresh_view, needs_refresh_message, 그리고 needs_refresh_message_category:

login_manager.refresh_view = "accounts.reauthenticate" login_manager.needs_refresh_message = ( u"To protect your account, please reauthenticate to access this page." ) login_manager.needs_refresh_message_category = "info"

또는 새로 고침을 처리하기 위해 고유 한 콜백을 제공하여 :

@login_manager.needs_refresh_handler def refresh(): # do stuff return a_response

세션을 다시 최신으로 표시하려면 confirm_login함수를 호출하십시오 .

쿠키 설정 

쿠키의 세부 사항은 응용 프로그램 설정에서 사용자 지정할 수 있습니다.

REMEMBER_COOKIE_NAME "기억하기"정보를 저장할 쿠키의 이름입니다. 기본값 : remember_token
REMEMBER_COOKIE_DURATION 쿠키가 만료되기 전의 시간으로 datetime.timedelta개체 또는 정수 초입니다. 기본값 : 365 일 (도약 이외의 1 년)
REMEMBER_COOKIE_DOMAIN "Remember Me"쿠키가 도메인을 교차해야하는 경우 여기에 도메인 값을 설정하십시오 (예 :의 .example.com 모든 하위 도메인에서 쿠키를 사용하도록 허용 example.com). 기본: None
REMEMBER_COOKIE_PATH “Remember Me”쿠키를 특정 경로로 제한합니다. 기본: /
REMEMBER_COOKIE_SECURE "Remember Me"쿠키의 범위를 보안 채널 (일반적으로 HTTPS)로 제한합니다. 기본: None
REMEMBER_COOKIE_HTTPONLY 클라이언트 측 스크립트가 "Remember Me"쿠키에 액세스하지 못하게합니다. 기본: False
REMEMBER_COOKIE_REFRESH_EACH_REQUEST True쿠키로 설정하면 요청마다 새로 고쳐 지므로 수명이 단축됩니다. 플라스크처럼 작동합니다 SESSION_REFRESH_EACH_REQUEST. 기본: False

세션 보호 

위의 기능은 쿠키 도둑으로부터“Remember Me”토큰을 보호하는 데 도움이되지만 세션 쿠키는 여전히 취약합니다. Flask-Login에는 세션 보호 기능이있어 사용자의 세션 도난을 방지 할 수 있습니다.

LoginManager및 앱 구성에서 세션 보호를 구성 할 수 있습니다 . 활성화 된 경우 basic또는 strong 모드 에서 작동 할 수 있습니다 . 상의를 설정하려면 LoginManager, 설정된 session_protection속성을하는 "basic" "strong":

login_manager.session_protection = "strong"

또는 비활성화하려면 :

login_manager.session_protection = None

기본적으로 "basic"모드 에서 활성화 됩니다. 그것은 설정하여 응용 프로그램의 설정에서 비활성화 할 수 있습니다 SESSION_PROTECTION에 대한 설정을 None, "basic"또는 "strong".

세션 보호가 활성화되면 각 요청마다 사용자 컴퓨터의 식별자 (기본적으로 IP 주소 및 사용자 에이전트의 보안 해시)가 생성됩니다. 세션에 연관된 식별자가 없으면 생성 된 식별자가 저장됩니다. 식별자가 있고 생성 된 식별자와 일치하면 요청이 정상입니다.

식별자가 basic모드에서 일치하지 않거나 세션이 영구적 일 경우 세션은 단순히 새로 고침되지 않은 것으로 표시되며 새로 로그인해야하는 모든 것 때문에 사용자가 다시 인증해야합니다. (물론, 유효한 경우 새 로그인을 사용하고 있어야합니다.)

strong비 영구 세션의 모드 에서 식별자가 일치하지 않으면 전체 세션 (및 기억 토큰이있는 경우)이 삭제됩니다.

API에 대한 세션 쿠키를 사용하지 않도록 설정 

API 인증시 Flask Session 쿠키 설정을 비활성화 할 수 있습니다. 이렇게하려면 요청에 설정 한 플래그에 따라 세션 저장을 건너 뛰는 사용자 정의 세션 인터페이스를 사용하십시오. 예를 들면 다음과 같습니다.

from flask import g from flask.sessions import SecureCookieSessionInterface from flask_login import user_loaded_from_header class CustomSessionInterface(SecureCookieSessionInterface): """Prevent creating session from API requests.""" def save_session(self, *args, **kwargs): if g.get('login_via_header'): return return super(CustomSessionInterface, self).save_session(*args, **kwargs) app.session_interface = CustomSessionInterface() @user_loaded_from_header.connect def user_loaded_from_header(self, user=None): g.login_via_header = True

이렇게하면 사용자가를 사용하여 인증 할 때마다 플라스크 세션 쿠키를 설정할 수 없습니다 header_loader.

현지화 

기본적 으로 사용자가 로그인해야 할 때 메시지를 표시 하는 LoginManager데 사용 flash됩니다.이 메시지는 영어로되어 있습니다. 당신은 현지화를 필요로하는 경우, 설정 localize_callback의 속성 LoginManager들이 전송되기 전에 이러한 메시지 호출 할 수있는 기능을 flash예를 들어, gettext. 이 함수는 메시지와 함께 호출되고 flash대신 반환 값이 전송 됩니다.

API 문서 

이 문서는 Flask-Login의 소스 코드에서 자동으로 생성됩니다.

로그인 설정하기 

클래스 flask_login.LoginManager( app = None , add_context_processor = True )[출처]

이 개체의 로깅에 사용되는 설정을 누릅니다.의 인스턴스를 사용 LoginManager하는 하지 그것을 공장 기능의 앱에 바인드 다음 코드의 본체에서 하나를 만들 수 있도록, 특정 애플리케이션에 바인딩을합니다.

setup_app( app , add_context_processor = True )[출처]

이 메소드는 더 이상 사용되지 않습니다. LoginManager.init_app()대신 사용하십시오 .

unauthorized( )[출처]

사용자가 로그인해야 할 때 호출됩니다.에 콜백을 등록하면 호출됩니다 LoginManager.unauthorized_handler(). 그렇지 않으면 다음 조치를 수행합니다.

  • LoginManager.login_message사용자에게 플래시 .
  • 앱이 블루 프린트를 사용하는 경우을 사용하여 현재 블루 프린트의 로그인보기를 찾으십시오 blueprint_login_views. 앱이 블루 프린트를 사용하지 않거나 현재 블루 프린트에 대한 로그인보기가 지정되지 않은 경우의 값을 사용하십시오 login_view.
  • 사용자를 로그인보기로 리디렉션하십시오. 액세스하려는 페이지는 next쿼리 문자열 변수 로 전달 되므로 홈페이지 대신 존재하는 경우 리디렉션 할 수 있습니다. 또는 nextUSE_SESSION_FOR_NEXT가 설정된 것처럼 세션에 추가됩니다 .

LoginManager.login_view정의되지 않은 경우 HTTP 401 (무단) 오류가 대신 발생합니다.

이것은 뷰 또는 before / after_request 함수에서 리턴되어야하며, 그렇지 않으면 경로 재 지정이 적용되지 않습니다.

needs_refresh( )[출처]

사용자가 로그인 할 때 호출되지만 세션이 오래되었으므로 다시 인증해야합니다. 에 콜백을 등록하면 호출됩니다 needs_refresh_handler. 그렇지 않으면 다음 조치를 수행합니다.

  • LoginManager.needs_refresh_message사용자에게 플래시 .
  • 사용자를로 리디렉션하십시오 LoginManager.refresh_view. 액세스하려는 페이지는 next 쿼리 문자열 변수 로 전달 되므로 홈페이지 대신 존재하는 경우 리디렉션 할 수 있습니다.

LoginManager.refresh_view정의되지 않은 경우 HTTP 401 (무단) 오류가 대신 발생합니다.

이것은 뷰 또는 before / after_request 함수에서 리턴되어야하며, 그렇지 않으면 경로 재 지정이 적용되지 않습니다.

일반 구성

user_loader( 콜백 )[출처]

세션에서 사용자를 다시로드하기위한 콜백을 설정합니다. 설정 한 함수는 사용자 ID (a unicode)를 가져 와서 사용자 개체를 반환하거나 None사용자가 존재하지 않는 경우 반환해야 합니다.

매개 변수 :

콜백 ( callable ) – 사용자 객체를 검색하기위한 콜백입니다.

header_loader( 콜백 )[출처]

이 기능은 더 이상 사용되지 않습니다. LoginManager.request_loader()대신 사용하십시오 .

헤더 값에서 사용자를로드하기위한 콜백을 설정합니다. 설정 한 함수는 인증 토큰을 가져 와서 사용자 개체를 반환하거나 None사용자가없는 경우 반환해야 합니다.

매개 변수 :

콜백 ( callable ) – 사용자 객체를 검색하기위한 콜백입니다.

anonymous_user

익명 사용자를 생성하는 클래스 또는 팩토리 함수로, 아무도 로그인하지 않은 경우에 사용됩니다.

unauthorized 구성

login_view

사용자가 로그인해야 할 때 리디렉션 할보기의 이름입니다. (인증 기관이 응용 프로그램 외부에있는 경우에도 절대 URL 일 수 있습니다.)

login_message

사용자가 로그인 페이지로 리디렉션 될 때 깜박이는 메시지입니다.

unauthorized_handler( 콜백 )[출처]

이것에 의해 unauthorized메소드 가 사용하는 콜백이 설정 됩니다 login_required. 인수를 취하지 않으며 일반보기 대신 사용자에게 보낼 응답을 리턴해야합니다.

매개 변수 :

콜백 ( callable ) – 인증되지 않은 사용자의 콜백입니다.

needs_refresh 구성

refresh_view

사용자를 다시 인증해야 할 때 리디렉션 할보기의 이름입니다.

needs_refresh_message

사용자가 재 인증 페이지로 리디렉션 될 때 깜박이는 메시지입니다.

needs_refresh_handler( 콜백 )[출처]

이것에 의해 needs_refresh메소드 가 사용하는 콜백이 설정 됩니다 fresh_login_required. 인수를 취하지 않으며 일반보기 대신 사용자에게 보낼 응답을 리턴해야합니다.

매개 변수 :

콜백 ( callable ) – 인증되지 않은 사용자의 콜백입니다.

로그인 메커니즘 

flask_login.current_user

현재 사용자의 프록시

flask_login.login_fresh( )[출처]

True현재 로그인이 최신인지를 반환 합니다.

flask_login.login_user( user , remember = False , duration = None , force = False , fresh = True )[출처]

사용자를 로그인합니다. 실제 사용자 개체를 여기에 전달해야합니다. 사용자 is_active속성이 False인 경우 forceis가 아닌 한 로그인하지 않습니다 True.

이것은 True로그인 시도가 성공 False하고 실패한 경우 (즉, 사용자가 비활성화되어 있기 때문에) 리턴 합니다 .

매개 변수 :

  • user ( object ) – 로그인 할 사용자 개체입니다.
  • remember ( bool ) – 세션이 만료 된 후 사용자를 기억할지 여부입니다. 기본값은 False입니다.
  • duration ( datetime.timedelta) – 기억 쿠키가 만료되기 전의 시간입니다. 경우 None설정의 값 세트가 사용됩니다. 기본값은 None입니다.
  • force ( bool ) – 사용자가 비활성 인 경우,이를 설정하여 사용자가 True로그인하지 않게합니다. 기본값은 False입니다.
  • fresh ( bool ) – False"fresh"가 아닌 것으로 표시된 세션으로 사용자를 로그인 하도록 설정합니다 . 기본값은 True입니다.

flask_login.logout_user( )[출처]

사용자를 로그 아웃합니다. (실제 사용자를 전달할 필요는 없습니다.) 또한 Remember me 쿠키가있는 경우이를 정리합니다.

flask_login.confirm_login( )[출처]

현재 세션을 최신으로 설정합니다. 쿠키에서 세션을 다시로드하면 세션이 오래됩니다.

뷰 보호 

flask_login.login_required( 펑크 )[출처]

이를 사용하여보기를 장식하면 실제보기를 호출하기 전에 현재 사용자가 로그인 및 인증되었는지 확인합니다. 그렇지 않은 경우 LoginManager.unauthorized콜백을 호출합니다 . 예를 들면 다음과 같습니다.

@app.route('/post') @login_required def post(): pass

사용자가 로그인해야하는 특정 시간 만 필요한 경우 다음을 수행하면됩니다.

if not current_user.is_authenticated: return current_app.login_manager.unauthorized()

...이 함수는 뷰에 추가하는 코드입니다.

단위 테스트시 인증을 전체적으로 끄는 것이 편리 할 수 ​​있습니다. 이를 활성화하기 위해 애플리케이션 구성 변수 LOGIN_DISABLED 가로 설정된 True경우이 데코레이터는 무시됩니다.

노트

 CORS에 대한 W3 지침 요청을 프리 플라이트 , HTTP를 OPTIONS요청 로그인 검사에서 제외됩니다.

매개 변수 :

func ( function ) – 장식 할 뷰 함수입니다.

flask_login.fresh_login_required( 펑크 )[출처]

이를 사용하여보기를 장식하면 현재 사용자의 로그인이 최신 상태인지 확인합니다. 즉, 세션이 '기억하기'쿠키에서 복원되지 않았습니다. 쿠키 도둑의 노력을 방해하기 위해 비밀번호 나 이메일 변경과 같은 민감한 작업을 보호해야합니다.

사용자가 인증되지 않은 경우 LoginManager.unauthorized()정상으로 호출됩니다. 인증되었지만 세션이 최신 상태가 아닌 경우 LoginManager.needs_refresh()대신 호출 됩니다. (이 경우을 제공해야합니다 LoginManager.refresh_view.)

구성 login_required()변수와 관련 하여 데코레이터와 동일하게 작동합니다 .

노트

 CORS에 대한 W3 지침 요청을 프리 플라이트 , HTTP를 OPTIONS요청 로그인 검사에서 제외됩니다.

매개 변수 :

func ( function ) – 장식 할 뷰 함수입니다.

사용자 개체 도우미 

수업 flask_login.UserMixin[출처]

이것은 Flask-Login이 사용자 객체가 가질 것으로 기대하는 메소드에 대한 기본 구현을 제공합니다.

수업 flask_login.AnonymousUserMixin[출처]

익명 사용자를 나타내는 기본 개체입니다.

유틸리티 

flask_login.login_url( login_view , next_url = 없음 , next_field = 'next' )[출처]

로그인 페이지로 리디렉션하기위한 URL을 만듭니다. login_view제공되는 경우 URL 만 반환합니다. next_url그러나 제공되는 경우 next=URL로그인보기가 해당 URL로 다시 리디렉션 될 수 있도록 쿼리 문자열에 매개 변수 가 추가 됩니다. Flask-Login의 기본 무단 핸들러는 로그인 URL로 리디렉션 할 때이 기능을 사용합니다. 사용 된 호스트 이름을 강제하려면 호스트로 설정하십시오 FORCE_HOST_FOR_REDIRECTS. 요청 헤더 Host 또는 X-Forwarded-For가있는 경우 외부 사이트로 리디렉션되지 않습니다.

매개 변수 :

  • login_view ( str ) – 로그인보기의 이름입니다. 또는 로그인보기의 실제 URL입니다.
  • next_url ( str ) – 리디렉션을위한 로그인보기를 제공 할 URL입니다.
  • next_field ( str ) – 다음 URL을 저장할 필드입니다. 기본값은 next입니다.

신호 

코드에서 이러한 신호를 사용하는 방법에 대한 정보 는 신호에 대한 Flask 설명서를 참조하십시오 .

flask_login.user_logged_in

사용자가 로그인하면 전송됩니다. 발신자 인 앱 외에도 앱이 전달됩니다 user(이는 로그인 한 사용자 임).

flask_login.user_logged_out

사용자가 로그 아웃 할 때 전송됩니다. 발신자 인 앱 외에도 앱이 전달 user되어 로그 아웃중인 사용자입니다.

flask_login.user_login_confirmed

사용자의 로그인이 확인되면 새 것으로 표시됩니다. (일반 로그인을 위해 호출되지는 않습니다.) 앱 외에 추가 인수를받지 않습니다.

flask_login.user_unauthorized

에서 unauthorized메소드가 호출 될 때 전송됩니다 LoginManager. 앱 외에 추가 인수를받지 않습니다.

flask_login.user_needs_refresh

에서 needs_refresh메소드가 호출 될 때 전송됩니다 LoginManager. 앱 외에 추가 인수를받지 않습니다.

flask_login.session_protected

세션 보호가 적용될 때마다 전송되며 세션이 새로 고침되지 않거나 삭제 된 것으로 표시됩니다. 앱 외에 추가 인수를받지 않습니다.

대단한건 아니고, flask 는 기본적으로 jinja2 를 템플릿 언어로 사용하는데 사용하다 보면 하나의 template에서 공통적으로 사용되어 지는 부분이 있다. 예를 들면, 같은 css 나, 자바스크립트를 가져오는 header의 부분이나 상단의 navigation 부분, 하단의 footer 부분이 그러한데 일일히 모든 템플릿에 넣어 주기는 귀찮다. 그래서 jinja2 에서는{%  include %} 를 통해서 하나의 html 에서 다른 html 을 가져올수 있도록 해준다. 단순히 가져오는 것이라고 생각할수 있는데 내부적으로는 랜더링된 결과를 리턴한다고 한다. 

<body>
		 {% include 'nav.html' %}
		<div class="container">
		...
		</div>
</body>

//nav.html
<ul class="nav navbar-nav navbar-right">
  <li>
		{% if status == 0 %}
			<a href="/login">Login</a>
		{% else %}
			<a href="/login">Logout</a>
		{%endif%}
	</li>
</ul>

의 예처럼 nav.html 에서는 status 라는 flask 로 부터 받아온 값으로 Login, Logout 을 보여줄지를 결정하는데(그리 좋은 예제는 아님) nav.html 에서 랜더링 된 html 이 include를 사용한 쪽에 포함되는 것이다. 

include 문에는 ignore missing 옵션이 있는데 해당 옵션은 말 그대로 없으면 무시해라 라는 옵션이다. 위의 예에서 만약 nav.html 이 존재하지 않는다면, 호출한 페이지를 브라우저에서 열었을때 에러가 발생되고 flask에서는 nav.html이 없다는 에러 메시지가 출력이 된다. 그렇지만 아래처럼 설정하게 되면 없는 부분을 무시하고 나오게 된다.

http://blog.weirdx.io/post/884

CURRENT_USER

검사 권한에 따라 데이터베이스의 현재 "유효" 사용자 이름을 반환합니다. 일반적으로 이 사용자 이름은 세션 사용자와 동일하지만 경우에 따라 수퍼유저에 의해 변경될 수 있습니다.

참고

CURRENT_USER를 호출할 때는 후행 괄호를 사용하지 마십시오.

 

반환 유형

CURRENT_USER는 CHAR 또는 VARCHAR 문자열을 반환합니다.

다음은 현재 데이터베이스 사용자의 이름을 반환하는 쿼리입니다.

 

select current_user;

 

current_user

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

dwuser (1 row)

 

HTTP 요청 전후에 호출되는 데코레이터

# -*- encoding:utf8 -*-
from flask import Flask
app = Flask(__name__)

@app.route("/")
def main():
print("/")
return "/"

@app.before_first_request
def before_first_request():
print("앱이 기동되고 나서 첫 번째 HTTP 요청에만 응답")

@app.before_request
def before_request():
print("매 HTTP 요청이 처리되기 전에 실행")

@app.after_request
def after_request(response):
print("매 HTTP 요청이 처리되고 나서 실행")
return response

@app.teardown_request
def teardown_request(exception):
print("매 HTTP요청의 결과가 브라우저에 응답하고 나서 호출")

@app.teardown_appcontext
def teardown_appcontext(exception):
print("HTTP요청의 어플리케이션 컨텍스트가 종료될때 실행")

 

 is_authenticated 소개 및 예시

is_authenticated는 위에서 살펴 본 is_anonymous와 반대된다고 생각하시면 됩니다. 저 코드와 반대로 로그인 여부를 묻는 것입니다. 만약 로그인 되어 있다면 이 코드는 True를 반환합니다. 그렇다면 이 코드가 views.py에서 어떻게 사용되는지 알아볼까요?

 

1

2

3

4

5

6

if request.user.is_authenticated:

    pass

    # do something if user is logged in

else:

    pass

    # do something if user is logged_out

 

 

이렇게 위와는 반대로 사용되게 됩니다. 그렇다면 템플릿 태그는 어떨지 알아보겠습니다. 

 

1

2

3

{% if user.is_authenticated %}

    <p>이 유저는 로그인 되어 있습니다.</p>

{% endif %}

   

 

이렇게 사용되게 됩니다. 템플릿 태그를 이용하면 둘 중 하나만 알아도 대부분의 코드를 구현할 수 있을 것입니다. 

 

 

1

2

3

4

5

{% if user.is_authenticated %}

    <p>이 유저는 로그인 되어 있습니다.</p>

{% else %}

    <p>이 유저는 로그아웃 되어 있습니다..</p>

{% endif %}

 

 

이렇게 사용하면 위에서 {% if user.is_authenticated %}가 False를 반환하게 될 경우 {% else %}안의 코드가 실행됩니다. 그러므로 한 가지만 알면 두 가지 경우를 다 처리할 수 있습니다.

 

render_template 사용법

#

플라스크를 사용하면 동적 웹 페이지 컨텐츠에 대한 템플리트를 사용할 수 있습니다.

템플릿을 사용하는 프로젝트 구조의 예는 다음과 같습니다.

myproject/
    /app/
        /templates/
            /index.html
        /views.py

 

views.py :

from flask import Flask, render_template


app = Flask(__name__)

@app.route("/")
def index():
    pagetitle = "HomePage"
    return render_template("index.html",
                            mytitle=pagetitle,
                            mycontent="Hello World")

 

render_templates 함수에 키 / 값 쌍을 추가하여 경로 처리기의 동적 내용을 템플릿에 전달할 수 있습니다. 위의 예에서 "pagetitle"및 "mycontent"변수는 렌더링 된 페이지에 포함되도록 템플리트에 전달됩니다. 템플릿에 다음 변수를 두 개의 중괄호로 {{mytitle}} . {{mytitle}}

index.html :

<html>
    <head>
        <title>{{ mytitle }}</title>
    </head>
    <body>
        <p>{{ mycontent }}</p>
    </body>
</html>

 

첫 번째 예와 같이 실행하면 http://localhost:5000/ "HomePage"라는 제목과 "Hello World"라는 내용의 단락이 있습니다.

 

로컬 호스트에서 웹서버 구동 시

 

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href="http://127.0.0.1:5000/hello">내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

 

 but 배포시 웹서버의 주소가 바뀌기 때문에 사용 할 수 없다.

 

그래서 아래와 같이 url_for 함수를 사용 하면 알아서 내부 웹서버의 주소를 바꿔주기 때문에 바꿀 필요가 없다.

 

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href={{ url_for('hello') }}>내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

 

 

URL에 파라미터 값을 넣을 땐 '파라미터 = 값' 형태로 넣어준다.(값은 ""로 감싸줘야한다)

<!doctype html>

<html>

  <head>

  <link rel="stylesheet" href="{{ url_for('static', filename='css/w3.css') }}">

  </head>

  <body>

  <div class="w3-container w3-center">

    <h2>{{ subject }}</h2>

    <a href={{ url_for('hello', variable="foo", act="do") }}>내 웹싸이트의 hello로 이동합니다.</a>

  </div>

  </body>

</html>

+ Recent posts