Python 如何使用路径参数创建单个搜索API(未使用表单)

Python 如何使用路径参数创建单个搜索API(未使用表单),python,flask,flask-restful,Python,Flask,Flask Restful,我一直在使用此视图搜索单词,如下所示: db指的是mongo连接(仅供参考) 这是否可以以更动态的方式完成?我的意思是,这只适用于word,而不适用于其他选择,或以下选择的组合: 搜索输入如下所示: word length: () word type : () word : () submit 现在我拥有的API只有在我发送word时才匹配,但是我如何编写一个API,使它能够匹配所有可能的组合,如wordlength+word-type,word+word-ty

我一直在使用此视图搜索
单词
,如下所示:

db
指的是mongo连接(仅供参考)

这是否可以以更动态的方式完成?我的意思是,这只适用于
word
,而不适用于其他选择,或以下选择的组合:

搜索输入如下所示:

word length: ()
word type  : ()
word       : ()
         submit
现在我拥有的API只有在我发送word时才匹配,但是我如何编写一个API,使它能够匹配所有可能的组合,如word
length+word-type
word+word-type
(我将自己定义查询)

我尝试的是:

@app.route('/<n>-letter-words', methods=['GET', 'POST'])
@app.route('/words-<word>', methods=['GET', 'POST'])
def wordsearch(word=None,n=None):
    if word:
        collection_name=word[0].lower()+'_collection'
        words=db[collection_name]
        data=words.find({'word':word})
        return render_template('wordsearch.html',data=data)

    data = 'you are searching with' + n + 'words'
    return render_template('lettersearch.html', data=data)
但困惑的是,如果有这样的组合,
6个字母的动词中的单词
动词在这里是一种
词类

还有,如何从模板中为这些组合匹配相同的URL,就像我在上面的
脚本
中使用JQuery一样

这是正确的方法吗,我想在视图中编写所有可能的路由并将其从模板与Jquery中的条件匹配是个坏主意


感谢您提供任何帮助/指导链接,在flask中,您可以从请求本身获取参数

来自flask导入请求
@app.route(“/endpoint”)
def myfn():
val1=request.args.get('arg1')
val2=request.args.get('arg2')
因此,您可以在前端执行以下操作:


在服务器端

@app.route('/words search',methods=['GET',POST'])
def wordsearch(word):
wordlen=request.args.get('wordlen')
wordtype=request.args.get('wordtype')
word=request.args.get('word')
...

根据我的意见,建议不要,并遵循(其中
/foo+bar
/bar+foo
不能代表相同的资源),以下是您实际需要的所有内容,并自动处理值的URI编码,而您的原始版本根本没有处理URI编码,并且不需要任何类型的额外客户端JavaScript:

<form action="/search"><input name="q"></form>


这就是谷歌(或DuckDuckGo,或Yahoo!或…)搜索表单的基本运作方式。默认方法是GET(使用查询字符串),输入字段的缩写为“字段名”
q
(缩写为
query
)。使用一点点JS,就可以绕过表单编码,直接将查询应用为“”——但记住在组合之前对值/查询/搜索词进行URI/URL编码!(这样做可能会绕过支持web框架执行的任何“表单数据”收集,例如,您需要自己拉出
请求。查询字符串

因此,在提交时,我不必从模板中执行任何操作?不,您可以在此处提交表单我不使用任何表单,因为我只是显示字段和搜索按钮,在搜索/提交时,我希望映射到视图中的确切URL,因此我在模板中使用的脚本在“/”上提交表单是更简单的方法。如果您想使用js代码提交它,仍然可以使用form方法。如果您无法使用表单方法,您可以将URL作为“?arg1=val1&arg2=val2”加载。我已经更新了我的问题,也许您现在明白了。这种方法可能……不明智。
/foo+bar
/bar+foo
是同一资源吗?答:不会。它们会产生同样的效果吗?取决于所使用的底层搜索引擎,但URI应该是唯一的。
/search?foo+bar
/search?bar+foo
是同一资源吗?A:是的。两者都是“搜索”资源,只是提供了不同的“查询字符串”。它被称为«查询»字符串,应该是关于预期用途的强烈提示。编辑以添加:注意,构造查询字符串时不需要涉及任何表单。表单只是让它变得更简单,但是限制您使用
key=value
。啊,还有一个非常简短的跟进;想要避免(而不是利用/利用)标准浏览器行为,对于探索“web”(不仅仅是HTTP)的工作原理来说,通常不是一个好迹象@amcgregor绝对有道理,所以它总是建议基于
/search?bar+foo
,这样我就可以避免任何
jquery
,这是对的还是我理解错了?@amcgregor抱歉,我根本无法理解第二点。虽然我非常不喜欢ES5,但ES6很漂亮。而且速度快了好几个数量级。关键是要遵循的意图,并且不要忽略浏览器提供的自动功能。因此,考虑到如何处理表单发送的空输入?例如:我有4个字段,
a
b
c
d
,我点击了search,只给出了
a
,现在我应该如何处理这个问题?对于
a
,我有一个条件,同样对于所有的,我也有它们组合的条件,比如(if
a
b
)搜索是否执行某些操作…….如何处理route下的所有这些视图中的方法?@Codenewbie在Flask应用程序的端点/视图中,访问访问查询字符串本身。不管传入的是什么组合;这只是一根绳子。(99%的时间是UTF-8,因此您需要
.decode('UTF-8')
这一点。)@Codenewbie如果使用标准HTML表单提交(提交的字符串被“分配”到一个“字段名”),您将需要访问,例如
请求.args['q']
,如果
。请参见。当我做某事时,仅提交url()中的
lettersearch
字段和
400错误请求
@app.route('/<n>-letter-words', methods=['GET', 'POST'])
@app.route('/words-<word>', methods=['GET', 'POST'])
def wordsearch(word=None,n=None):
    if word:
        collection_name=word[0].lower()+'_collection'
        words=db[collection_name]
        data=words.find({'word':word})
        return render_template('wordsearch.html',data=data)

    data = 'you are searching with' + n + 'words'
    return render_template('lettersearch.html', data=data)
    <script type="text/javascript">
        $(document).ready(function(){
         $('#submit').on('click', function() {
              var lettervalue = $("#wordlength").val();
              var wordvalue = $("#word").val();
              if (lettervalue==''){
                    window.location.href ="/"+"words-"+wordvalue;
               }
               else{
                window.location.href ="/"+lettervalue+"-letter-words";
               }
              })
         });
    </script>
<form action="/search"><input name="q"></form>