python - 使用 curl 发送请求时,Flask 可以处理会话吗? [复制]

Posted

技术标签:

【中文标题】python - 使用 curl 发送请求时,Flask 可以处理会话吗? [复制]【英文标题】:python - Can Flask deal with sessions when using curl to send request? [duplicate] 【发布时间】: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)

【问题讨论】:

【参考方案1】:

默认情况下,Flask 使用 cookie 管理会话。引用Sessions documentation:

这是在 cookie 之上为您实现的,并以加密方式对 cookie 进行签名。这意味着用户可以查看您的 cookie 的内容但不能修改它,除非他们知道用于签名的密钥。

您可以从 curl cli 管理 cookie。参考this answer

要写入 cookie 文件并启动引擎并使用 cookie,您可以使用: curl -c /path/to/cookiefile http://yourhost/

从中读取 cookie 并启动 cookie 引擎,或者如果它不是文件,它将传递给定的字符串。 curl -b /path/to/cookiefile http//yourhost/

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

【讨论】:

以上是关于python - 使用 curl 发送请求时,Flask 可以处理会话吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

关于在php中使用curl发送get请求时参数传递问题的解析

linux shell中curl 发送post请求json格式问题

PHP cURL无法向api发送POST请求

Python:使用cherrypy通过POST发送和接收大文件

如何在curl php中发送第二个请求时保留会话?

通过 Qt 发送 PUT 请求时错误的请求类型 PUT,适用于 curl