Werkzeug: рд╕реНрд▓реИрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рджреЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬрдире░ 2018  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/werkzeug

рд╣рдо рдПрдХ REST API рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Werkzeug рдФрд░ Flask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╣рдо рдЕрдиреБрдЧрд╛рдореА рд╕реНрд▓реИрд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ GETs рдФрд░ рдЕрдиреНрдп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд┐рд╖рдорддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рд╕рдЦреНрдд рд╣реЛрдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдо рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ ( Rule.match рдФрд░ RequestSlash ) рдореЗрдВ рд╣реБрдХ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреНрд░рдо рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реЛрдЧрд╛? URL рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдкрд░ append_slash (рд╕рдорддреБрд▓реНрдп Django рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░) рдЬреИрд╕рд╛ рдХреБрдЫ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

app.url_map.strict_slashes = False рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓

рд╕рднреА 7 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

app.url_map.strict_slashes = False рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓

рд╕реНрд▓реИрд╢ рдЧреБрдо рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рд░реНрдЧ рдорд┐рд▓рд╛рди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ 404 рдкрд░ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ:

| рдирд┐рдпрдо рдореЗрдВ рдЕрдиреБрдЧрд╛рдореА рд╕реНрд▓реИрд╢ рд╣реИ | рдкрде рдореЗрдВ рдЕрдиреБрдЧрд╛рдореА рд╕реНрд▓реИрд╢ рд╣реИ | strict_slashes | рдкрд░рд┐рдгрд╛рдо |
|-|-|-|-|
| рдПрди | рдПрди | True | (рдореИрдЪ) |
| рдПрди | рдПрди | False | (рдореИрдЪ) |
| рдПрди | рд╡рд╛рдИ | True | 404 |
| рдПрди | рд╡рд╛рдИ | False | 404 |
| рд╡рд╛рдИ | рдПрди | True | 301 |
| рд╡рд╛рдИ | рдПрди | False | (рдореИрдЪ) |
| рд╡рд╛рдИ | рд╡рд╛рдИ | True | (рдореИрдЪ) |
| рд╡рд╛рдИ | рд╡рд╛рдИ | False | (рдореИрдЪ) |

рдореБрдЭреЗ 404 рдЪрд╛рд╣рд┐рдП рдЬрдм рдирд┐рдпрдо рдореЗрдВ рдкрд┐рдЫрд▓рд╛ рд╕реНрд▓реИрд╢ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкрде рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрднреА рдореИрдВ рдЗрд╕реЗ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

class StrictRule(Rule):
    def match(self, path, method=None):
        try:
            result = super(StrictRule, self).match(path, method)
        except RequestSlash:
            return None

        return result

рд▓реЗрдХрд┐рди рдореИрдВ рдЗрдВрдЯрд░реНрдирд▓ рдореЗрдВ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреВрдВрдЧрд╛ред

рдХрд╕реНрдЯрдо рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рд╣рдордиреЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдмрдирд╛рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдо рд╕реЗ рдкрд░реЗ рдПрдХ рдирд┐рдпрдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдлреНрд▓реИрд╢ рдХреЗ рд▓рд┐рдП, рдЖрдк url_rule_class рдХреЛ рдирдИ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╛рд╕реНрдХ рдбреЙрдХреНрд╕ рджреЗрдЦреЗрдВред http://flask.pocoo.org/docs/1.0/api/?highlight=rule#flask.Flask.url_rule_class

@ рдПрдВрдЧрд▓реИрдВрдбрд░

рдкреНрд░рддрд┐ https://github.com/pallets/werkzeug/issues/1246#issuecomment -362099342, рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдХрд╕реНрдЯрдо рдирд┐рдпрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рд╣реИред RequestSlash рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ https://github.com/pallets/werkzeug/blob/a220671d66755a94630a212378754bb432811158/src/werkzeug/routing.py#L259 -L260 рдкреНрд░рддрд┐ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдХрд╛рдлреА рдЕрдЬреАрдм рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдбред

рдФрд░ рдЬрдм рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЖрдзрд╛рд░ рдирд┐рдпрдореЛрдВ рдХреЛ рд╣рд░ рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреБрдкрд╕реНрдерд┐рдд рдЕрдиреБрдЧрд╛рдореА рд╕реНрд▓реИрд╢ рдкрд░ рдорд┐рд▓рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдкреВрд░реНрд╡ рдХрд▓рд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреИрдЯрд░реНрди APPEND_SLASH : https://docs.djangoproject.com/en/dev/ref/settings/#append -slash рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Django рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рдХреБрдЫ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ "рдЖрдВрддрд░рд┐рдХ" рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛," рдирд╣реАрдВ "рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдПред" рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИред

@davidism рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

abathur picture abathur  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

miki725 picture miki725  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidism picture davidism  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SimonSapin picture SimonSapin  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

asottile picture asottile  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ