Werkzeug: TypeError Π² BaseRequest.trusted_hosts, ΠΊΠΎΠ³Π΄Π° имя хоста начинаСтся с '.'

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 11 Π΄Π΅ΠΊ. 2017  Β·  1ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: pallets/werkzeug

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ хоста, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с . , Π΄ΠΎ wrappers.BaseRequest.trusted_hosts ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ TypeError: must be str, not bytes (Python 3.6) ΠΈΠ»ΠΈ TypeError: Can't convert 'bytes' object to str implicitly (Python 3.4), ΠΊΠ°ΠΊ Π² werkzeug.wsgi.host_is_trusted , _normalize сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ _encode_idna , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ ref Π² bytes , Π° Π·Π°Ρ‚Π΅ΠΌ, Ссли ΠΎΠ½ начинаСтся с '.', ΠΎΠ½ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ΡΡ с '.' , Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ смСшивая str ΠΈ bytes .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния

from flask import Flask, request

class TrustedHosts:
    """Flask extension setting `werkzeug.wrappers.BaseRequest.trusted_hosts`."""
    def __init__(self, app=None, trusted_hosts=None):
        self.app = app
        self.trusted_hosts = trusted_hosts
        if app is not None:
            self.init_app(app)

    def init_app(self, app):
        app.before_request(self.set_trusted_hosts)

    def set_trusted_hosts(self):
        # As host is a <strong i="20">@cached_property</strong> this should before its first access.
        request.trusted_hosts = self.trusted_hosts
        print(request.host)

app = Flask(__name__)
TrustedHosts(app, trusted_hosts=['.example.com'])

@app.route('/')
def index():
    return 'OK'

Полная трассировка стСка

Traceback (most recent call last):
  File "c:\program files\python36\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "c:\program files\python36\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "c:\program files\python36\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "c:\program files\python36\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "c:\program files\python36\lib\site-packages\flask\app.py", line 1610, in full_dispatch_request
    rv = self.preprocess_request()
  File "c:\program files\python36\lib\site-packages\flask\app.py", line 1831, in preprocess_request
    rv = func()
  File "D:\Dropbox\p\kb\python\web\flask\trusted_hosts.py", line 17, in set_trusted_hosts
    print(request.host)
  File "c:\program files\python36\lib\site-packages\werkzeug\local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
  File "c:\program files\python36\lib\site-packages\werkzeug\utils.py", line 73, in __get__
    value = self.func(obj)
  File "c:\program files\python36\lib\site-packages\werkzeug\wrappers.py", line 635, in host
    return get_host(self.environ, trusted_hosts=self.trusted_hosts)
  File "c:\program files\python36\lib\site-packages\werkzeug\wsgi.py", line 160, in get_host
    if not host_is_trusted(rv, trusted_hosts):
  File "c:\program files\python36\lib\site-packages\werkzeug\wsgi.py", line 132, in host_is_trusted
    if suffix_match and hostname.endswith('.' + ref):
TypeError: must be str, not bytes
127.0.0.1 - - [11/Dec/2017 17:11:18] "GET / HTTP/1.1" 500 -

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ before_request , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС, нСэффСктивСн. Подкласс Request , установитС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π½Π°Π·Π½Π°Ρ‡ΡŒΡ‚Π΅ класс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

from flask.wrappers import Request

class TrustedRequest(Request):
    trusted_hosts = ['a', 'b', 'c']

app.request_class = TrustedRequest

>ВсС замСчания

ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ before_request , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ это ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запросС, нСэффСктивСн. Подкласс Request , установитС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π½Π°Π·Π½Π°Ρ‡ΡŒΡ‚Π΅ класс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

from flask.wrappers import Request

class TrustedRequest(Request):
    trusted_hosts = ['a', 'b', 'c']

app.request_class = TrustedRequest
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ