bottle: как установить повара ie внутри декоратора python? - PullRequest
6 голосов
/ 08 мая 2020

Есть некоторые операции, которые необходимо выполнить перед запуском некоторых маршрутов. Например:

  • проверить, узнаем ли мы пользователя,
  • проверить язык,
  • проверить местоположение,
  • установить переменные на панели навигации (здесь после названного заголовка) html

и т. д., затем принимайте решения на основе результата и, наконец, запускайте запрошенный маршрут.

Мне трудно использовать respose.set_cook ie ("cookie_name", actual_cook ie) внутри декоратора. Кажется, что flask имеет объект make_response, который работает хорошо (см. Здесь о проблеме переполнения стека 34543157: Python Flask - Установка повара ie с использованием декоратора ), но я нахожу трудно воспроизвести то же самое с bottle.

в любом случае, вот моя попытка, которая не работает:

#python3
#/decorator_cookie.py

from bottle import request, response, redirect

from other_module import datamodel, db_pointer, secret_value #custom_module

import json

cookie_value = None
surfer_email_exist_in_db = None 
header = None 
db_pointer = instanciation_of_a_db_connexion_to_tables
surfer = db_pointer.get(request.get_cookie('surfer')) if  db_pointer.get(request.get_cookie('surfer')) != None else "empty"

def set_header(func):
    def header_manager():

        global cookie_value, surfer_email_exist_in_db, header, db_pointer                                                                                                                                   
        cookie_value = True #for stack-overflow question convenience
        surfer_email_exist_in_db = True #for stack-overflow question convenience

        if not all([cookie_value, surfer_email_exist_in_db]):
            redirect('/login')

        else:
            header = json.dumps(db_pointer.get('header_fr'))

            response.set_cookie("header", header, secret = secret_value, path = "/", httponly = True)

           return func()
    return header_manager

и основной файл, в котором маршрутизация идет на

#python3
#/main.py

from bottle import route, request
from decorator_cookie import set_header
from other_module secret_value

@route('/lets_try')
@set_header
def lets_try():

    header = request.get_cookie('header', secret = secret_value)
    print(header) #here I get None
    return template('lets_try.tpl', headers = header)

Я также пробовал установить повар ie вот так:


make_response = response(func).set_cookie("header", header, secret = secret_value, path = "/", httponly = True)

Но получил ошибку :) Вот ответ do c: Ответная документация

У вас есть подсказки? Спасибо

1 Ответ

3 голосов
/ 10 мая 2020

Нет проблем с вашим кодом, вам не хватает понимания, это понимание

Request 1 [By Browser/No Cookies] -> Request has No cookies -> Response you add cookie header

Request 2 [By Browser/Header Cookies] -> Request has Header cookies -> Response

Итак, для вашего первого запроса Request.get_cookie вернет None, но для вашего второго запроса он фактически вернется значение

Working fine

...