2017-03-01 19 views
0

이 질문에 대한 나의 목적은 내 API를 보호하는 것이다.Python/Flask - flask_httpauth와 함께 flask_restless 사용

내 응용 프로그램에서 내 Person 개체에 CRUD API를 제공하기 위해 Flask와 flask_restlessAPIManager을 사용하고 있습니다.

코드 샘플 :

manager = APIManager(app, flask_sqlalchemy_db=db) 
manager.create_api(Person, methods=['GET', 'POST', 'PATCH', 'DELETE']) 

과도 같은 내 다른 경로를 보호하기 위해 flask_httpauth를 사용하여 :

@app.route('/auth/get-token') 
@auth.login_required 
def get_auth_token(): 
    token = g.user.generate_auth_token() 
    return jsonify({'token': token.decode('ascii'), 'fullname': g.user.fullname}) 

나는 그것이 응답하지 위해 apimanager@auth.login_required를 사용하는 방법을 알아낼 수 없었다 익명의 요청에 대해 설명서에서 전 처리기에 대한 내용을 읽었을뿐 아니라 @auth.login_required 데코레이터에서 사용할 방법을 찾지 못했습니다.

어떤 도움을 주시면 감사하겠습니다.

답변

1

불행히도 Flask-Restless는 현재 관리중인 경로에 뷰 데코레이터를 부착하는 것을 공식적으로 지원하지 않습니다. 이 기능을 추가하려면 open issue이 있고 특별히 Flask-HTTPAuth에 대한 지원을 요청하는 another issue도 있습니다.

아직 third issue이 있는데, Flask-Restless가 끝점을 만든 후 사용자가 수동으로 장식자를 주입하는 기술을 보여줍니다. get_cache 장식을 추가하는 사용자의 예에서 조각은 다음과 같습니다 : 귀하의 경우

manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db) 
manager.create_api(Person, methods=['GET', 'POST', 'DELETE']) 
manager.create_api(Person2, methods=['GET', 'POST', 'DELETE']) 

# hackish view decoration: 
for model in [Person, Person2]: 
    model_route = '{0}api0.{0}api'.format(model.__name__.lower()) 
    app.view_functions[model_route] = get_cache(app.view_functions[model_route]) 

, 당신은 auth.login_requiredget_cache을 대체 할 것이다.

업데이트 : 아래의 설명에서와 같이 '{0}api0.{0}api'의 인수가 테이블 이름이므로 위의 코드는 Flask-SQLAlchemy가 생성 할 테이블 이름이 남아있는 경우에만 작동합니다. 모델에 사용자 정의 테이블 이름이있는 경우 model.__name__.lower() 대신 해당 이름을 사용하십시오.

+0

고맙습니다. 성가 시게되고 싶지는 않지만이 오류가 발생하고 무엇이 잘못되었는지 알 수 없습니다. app.view_functions [model_route] = auth.login_required (app.view_functions [model_route]) KeyError : 'personapi0.personapi'' –

+0

Woops, 알아 냈어. 분명히 플라스크가 문자를 클래스 이름의 접미사로 추가했기 때문에 Person API의 등록 된 기능을'personsapi0.personsapi '라고 부른다. 답에 이것을 추가하고 문제를 해결해 주셔서 고마워요. –

+0

다음과 같아야합니다 :'model_route = '{0} sapi0. {0} sapi'.format (model .__ name __. lower())' –

1

Flask-Security을 사용하는 것이 좋습니다. API 인터페이스 보안을 위해 API를 사용하는 방법은 tutorial입니다.

+0

음, 그게 최선의 해결책이라고 생각합니다. 감사합니다. –