Flask 有关BaseConverter和_init.py的问题__

Flask 有关BaseConverter和_init.py的问题__,flask,Flask,我正在尝试使用自定义Baseconverter来确保我的URL“干净”。我最终实现了如下目标: 我的init.py是: import os from flask import Flask from flask.ext.sqlalchemy import SQLAlchemy from flask.ext.login import LoginManager from flask.ext.openid import OpenID from config import basedir from slu

我正在尝试使用自定义Baseconverter来确保我的URL“干净”。我最终实现了如下目标:

我的
init.py
是:

import os
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager
from flask.ext.openid import OpenID
from config import basedir
from slugify import slugify
app = Flask(__name__)
from werkzeug.routing import BaseConverter
class MyStringConverter(BaseConverter):
    def to_python(self, value):
        return value
    def to_url(self, values):
        return slugify(values)
app.url_map.converters['mystring'] = MyStringConverter
app.config.from_object('config')
db = SQLAlchemy(app)
lm = LoginManager()
lm.init_app(app)
lm.login_view = 'login'
oid = OpenID(app, os.path.join(basedir, 'tmp'))

from app import views, models
但是,如果我定义
MyStringConverter
类,并在文件末尾添加
app.url\u map.converters['mystring']=MyStringConverter
,我会得到一个
LookupError:转换器'mystring'不存在
错误。为什么会这样


这是清理我的URL的正确方法吗?我不确定我是否需要对
to_python()
方法做些什么,或者我的方法是否正确。

如果您在数据库中查找记录,您可能希望在插入记录时创建slug,而不是每次需要构建URL时都使用自定义转换器。使用转换器,您将很难知道
'this-string'
是否真的是
'this string'
'this string'
,或者
'this string'
。我不明白这是为什么。示例视图是
@app.route('/search\u results/')def search\u results(query):返回render\u模板(“results.html”,query=query)
这里我仍然可以访问确切的查询。您是否需要传递给
slagify
的版本?啊,我明白您的意思了。您的意思是,在
search_results()
中,查询输入将是slagified版本。我当时的印象是,slugized版本将被路由,但view函数仍将获得原始版本,情况似乎并非如此。这意味着我必须按照您的建议存储slagify版本,或者在我的视图函数中执行某种类型的unslagify?我想第三种选择是同时传递段塞和原始字符串,但我不认为有办法在url中隐藏原始字符串,但仍然可以在view函数中访问它?您可以尝试反转段塞,但没有人能够可靠地处理大小写、空格和标点符号之类的内容。如果你最终都在URL中传递了这两个,那么使用slug就没有任何意义了。