【发布时间】:2017-02-25 06:16:40
【问题描述】:
我正在尝试为我的 iOS 移动应用构建一组 API。
我使用Flask-RESTful' to build RESTful type of interfaces andFlask-login` 来帮助我处理用户登录问题。
但是,我发现,当我使用curl 登录时,服务器确实返回成功消息,而我随后发送请求以获取只有登录的用户才能看到和获取的“受保护”页面
{ “消息”:“服务器无法验证您是否有权访问请求的 URL。您提供了错误的凭据(例如密码错误),或者您的浏览器不了解如何提供所需的凭据。” }
如果curl 没有发送一些“用户凭据”,这是否意味着当我的 iOS 应用发送请求时,后端仍然无法识别用户?
我不太了解 Flask 如何处理“会话”,而且我是 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 = {'foo@bar.tld': {'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)
【问题讨论】:
标签: python flask flask-login flask-restful