2017-11-28 1 views
0

저는 Flask로 웹 사이트를 개발 중이며 사용자 인터페이스 GUI와 API의 두 부분으로 구성되어 있습니다.브라우저 및 일부 API에서 내 웹 사이트에 액세스 할 수있는 경우 플라스크 로그인으로 두 가지 로그인 관리자를 사용할 수 있습니까?

현재 사용자 측 부분은 the standard process to authenticate a user이고 API는 suggested way to authenticate the users with APIs을 사용해야합니다.

두 가지 방법 모두 사용하기가 매우 쉽지만 실제로 응용 프로그램에서 두 가지 유스 케이스를 구분하기 위해 어떻게 함께 사용할 수 있는지 잘 모르겠습니다.

아이디어가 있으십니까?

내가 고려할 수있는 다른 접근 방법이 있습니까?

답변

1

두 개의 다른 로더를 사용할 수 있습니다.

Flask-Login은 쿠키가있을 때 user_loader으로 장식 된 함수를 호출합니다. 제공된 쿠키가없는 경우 request_loader으로 장식 된 함수는 [1]이라고합니다.

빠른 예 :

from flask import Flask, session 
from flask_login import LoginManager, current_user 

lm = LoginManager() 

users_by_id = {1: User(id=1, username='FirstUser')} 
users_by_key = {'xxxyyyzzz': User(id=2, username='SecondUser')} 

@lm.user_loader 
def load_user(user_ 
    anon = User(id=0, username='Anonymous') 
    return users_by_id.get(int(user_id), anon) 


@lm.request_loader 
def load_user(request): 
    anon = User(id=0, username='Anonymous') 
    header = request.headers.get('Auth', None) 
    if not header: 
     return anon 

    return users_by_key.get(header, anon) 


def create_app(): 
    app = Flask(__name__) 
    lm.init_app(app) 

    @app.route('/') 
    def index(): 
     return 'Hello, {}'.format(current_user) 

    @app.route('/login/') 
    def login(): 
     session['user_id'] = 1 
     return 'Logged in' 

    return app 


app = create_app() 
app.config['SECRET_KEY'] = 'secret-key' 
app.run() 

지금 당신은 당신의 브라우저 http://127.0.0.1:5000/login/로 가서 "로그인"을 선택한 후 인덱스 페이지는 FirstUser로 당신을 해결 올바르게 것입니다 수 있습니다.
그런 다음 다음과 같이 헤더를 통해 요청을 전송하고 인증 할 수 있습니다 :

>>> import requests 
>>> r = requests.get('http://127.0.0.1:5000/', headers={'Auth': 'xxxyyyzzz'}) 
>>> r.text 
"Hello, User('SecondUser')" 
+0

내가 모두 로더를 추가하려고하지만 request_loader 전혀 호출되지 않습니다. 가능한 이유는 무엇입니까? – heapOverflow

+1

내가 생각할 수있는 유일한 점은 쿠키가 보내 졌기 때문에'request_loader'가 건너 뛴다는 것입니다. API 요청은 어떻게 작성합니까? 답변을 작은 예제로 업데이트합니다. – leovp

+0

그것은 참으로 그 것이었다. 고맙습니다. – heapOverflow

관련 문제