2016-10-16 24 views
0

我正在嘗試爲iOS移動應用程序構建一組API。python - 使用curl發送請求時,Flask可以處理會話嗎?

我使用Flask-RESTful' to build RESTful type of interfaces and Flask-login`來幫助我處理用戶登錄問題。

然而,我發現,當我用curl登錄,服務器不會返回成功消息,而我則發送請求到得到「保護」頁面,只有登錄的用戶可以看到和得到

」message「:」服務器無法驗證您是否有權訪問請求的URL。您提供了錯誤的憑據(例如錯誤的密碼),或者瀏覽器不知道如何提供所需的憑據。 「 }

如果curl不發送一些「用戶證書」,這是否意味着,當我的iOS應用程序發送請求,後端仍不能識別用戶?

我不太瞭解Flask是如何處理'session'的,而我是web開發新手。有沒有解決方法?

這裏是我的代碼:

api.py

# -*- coding: utf-8 -*- 

import flask_login, json 
from flask import request 
from flask_restful import Resource, reqparse 
from models import users, User 

parser = reqparse.RequestParser() 


def request_parser(): 
    parser.add_argument('data', action='append') 
    return parser.parse_args()['data'][0] 


class Login(Resource): 
    def get(self): 
     return 

    def post(self): 
     # data = request_parser() 
     data = request.json['data'] 
     email = data['email'] 
     test = users[email] 
     if data['pw'] == users[email]['pw']: 
      user = User() 
      user.id = email 
      flask_login.login_user(user) 
      return 'login success' 

     return 'Bad login' 



class Protected(Resource): 
    @flask_login.login_required 
    def get(self): 
     return 'Logged in as: ' + flask_login.current_user.id 

models.py

# -*- coding: utf-8 -*- 
import flask_login 
from app import login_manager 


users = {'[email protected]': {'pw': 'secret'}} 


class User(flask_login.UserMixin): 
    pass 


@login_manager.user_loader 
def user_loader(email): 
    if email not in users: 
     return 

    user = User() 
    user.id = email 
    return user 


@login_manager.request_loader 
def request_loader(request): 
    email = request.form.get('email') 
    if email not in users: 
     return 

    user = User() 
    user.id = email 

    user.is_authenticated = request.form['pw'] == users[email]['pw'] 

    return user 

__init__.py

# -*- coding: utf-8 -*- 

from flask import Flask 
from flask_restful import Resource, Api 
from flask_sqlalchemy import SQLAlchemy 

import flask_login 
import config 

app = Flask(__name__) 
app.config.from_object("config") 
app.secret_key = 'yangjinglei' 

api = Api(app) 

login_manager = flask_login.LoginManager() 
login_manager.init_app(app) 

db = SQLAlchemy(app, use_native_unicode="utf8") 

run.py

# -*- coding: utf-8 -*- 

from app import app, api 
from app.api import * 


api.add_resource(Login, '/login') 
api.add_resource(Protected, '/protected') 

if __name__ == '__main__': 
    app.run(debug=True) 

回答

1

默認情況下,Flask使用cookie管理會話。引用Sessions documentation

這是在您的cookie上實現的,並以加密方式簽署cookie。這意味着用戶可以查看cookie的內容,但不能修改它,除非他們知道用於簽名的密鑰。

您可以通過curl cli管理cookie。請參閱this answer

要寫入cookie文件,啓動引擎,並使用餅乾,您可以使用: curl -c /path/to/cookiefile http://yourhost/

來讀取cookie和啓動發動機的cookie,或者如果它不是一個文件,它會傳遞給定的字符串。 curl -b /path/to/cookiefile http//yourhost/

可以遵循的另一種模式是server side sessions