Flask搜索查询不使用过滤器 [英] Flask search query not using filters

查看:316
本文介绍了Flask搜索查询不使用过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个工作Flask API,现在我想实现搜索查询。
我的理解是,过滤器应用于客户端,Flask API负责处理它。

  Flask = = 0.10.1 
Flask-HTTPAuth == 2.7.0
Flask-Limiter == 0.9.1
Flask-Login == 0.3.2
Flask-Mail == 0.9 .1
Flask-Principal == 0.4.0
Flask-Restless == 0.17.0

我遵循文档并执行了我的搜索查询,但仍然只是检索相同的结果:

http://flask-restless.readthedocs.org/en/latest/searchformat.html



无过滤:

  curl -u aaa:bbb -HContent-Type:application / json http://0.0.0.0:8080/api/1.0/job/ 

{
jobs:[
{
description:ESXi job完成,
reference:07FC78BCC0,
status:1
},
{
description:服务器发现失败。 HTTP S / SSH参数,
reference:A6EE28F4C0,
status:-1
}]
}

搜索查询基于:
http://flask-restless.readthedocs.org/en/latest/searchformat.html

  curl -u aaa:bbb -G -HContent-Type:application / json-d'{
> filters:[{name:description,op:like,val:%ESXi%}]}'http://0.0.0.0:8080/api/1.0/job /



  curl -u aaa:bbb -G -HContent-Type:application / json-d'{filters:[{name:status,op:eq, val:0}]}'http://0.0.0.0:8080/api/1.0/job/ 

同样的结果显示出来。

这是我的Flask终点:

  def get_jobs():


:return:

try:
log.info(request .remote_addr +''+ request .__ repr __())
jobs = Model.Job.query.order_by(desc(Model.Job.job_start))。limit(settings.items_per_page).all()

#============================================= ============
#获得工作
#========================== ===============================

values = ['description','status', 'reference']
response = [{v alue:value中的getattr(d,value)值} for d中的作业]
返回jsonify(jobs =响应)


除了例外,excpt:
log.exception(excpt .__ repr __())
response = json.dumps('Internal Server Error。 )
resp =回应(response,status = 500,mimetype ='application / json')
return resp

$ p $ 类Job(db.Model,AutoSerialize,Serializer)





__tablename__ ='job'
__public__ =('status','description','reference','job_start' ,'job_end')
id = Column(Integer,primary_key = True,server_default = text(nextval('job_id_seq':: regclass)))
description = Column(String(200))
reference = Column(String(50))
job_start = Column(DateTime)
job_end = Column(DateTime)
fk_server = Column(ForeignKey(u'server.id'))
owner_id = Column(ForeignKey(u'auth_user.id'))
is_cluster = Column(布尔值)
host_information =列(字符串(1024))
status =列,nullable = False)
owner = relationship(u'AuthUser')
se rver = relationship(u'Server')

def serialize(self):


:return:


d = Serializer.serialize(self)
return d

需要改变什么?

可能有 __ public __ 作为一个Job属性正在干扰过滤工作的方式。 Flask-Restless 文档中有关于此的警告。


I have a working Flask API and now I want to implement search queries. My understanding is that the filter is applied on the client and the Flask API takes care of it.

Flask==0.10.1
Flask-HTTPAuth==2.7.0
Flask-Limiter==0.9.1
Flask-Login==0.3.2
Flask-Mail==0.9.1
Flask-Principal==0.4.0
Flask-Restless==0.17.0

I have followed documentation and performed my search query, but still just retrieving same results:

http://flask-restless.readthedocs.org/en/latest/searchformat.html

No filter:

curl -u aaa:bbb -H "Content-Type: application/json" http://0.0.0.0:8080/api/1.0/job/

{
  "jobs": [
    {
      "description": "ESXi job completed", 
      "reference": "07FC78BCC0", 
      "status": 1
    }, 
    {
      "description": "Server discovery failed. Please verify HTTPS/SSH parameters", 
      "reference": "A6EE28F4C0", 
      "status": -1
    }]
}

Search query based on: http://flask-restless.readthedocs.org/en/latest/searchformat.html

curl -u aaa:bbb -G -H "Content-Type: application/json" -d '{
> "filters": [{"name": "description", "op": "like", "val": "%ESXi%"}]}' http://0.0.0.0:8080/api/1.0/job/

Or

curl -u aaa:bbb -G -H "Content-Type: application/json" -d '{"filters": [{"name": "status", "op": "eq", "val":0}]}' http://0.0.0.0:8080/api/1.0/job/

And same results are shown.

This is my Flask endpoint:

def get_jobs():
    """

    :return:
    """
    try:
        log.info(request.remote_addr + ' ' + request.__repr__())
        jobs = Model.Job.query.order_by(desc(Model.Job.job_start)).limit(settings.items_per_page).all()

        # =========================================================
        # Get JOBS
        # =========================================================

        values = ['description', 'status', 'reference']
        response = [{value: getattr(d, value) for value in values} for d in jobs]
        return jsonify(jobs=response)


    except Exception, excpt:
        log.exception(excpt.__repr__())
        response = json.dumps('Internal Server Error. Please try again later')
        resp = Response(response, status=500, mimetype='application/json')
        return resp

My Model

class Job(db.Model, AutoSerialize, Serializer):
    """

    """
    __tablename__ = 'job'
    __public__ = ('status','description','reference','job_start','job_end')
    id = Column(Integer, primary_key=True, server_default=text("nextval('job_id_seq'::regclass)"))
    description = Column(String(200))
    reference = Column(String(50))
    job_start = Column(DateTime)
    job_end = Column(DateTime)
    fk_server = Column(ForeignKey(u'server.id'))
    owner_id = Column(ForeignKey(u'auth_user.id'))
    is_cluster = Column(Boolean)
    host_information = Column(String(1024))
    status = Column(Integer, nullable=False)
    owner = relationship(u'AuthUser')
    server = relationship(u'Server')

    def serialize(self):
        """

        :return:
        """

        d = Serializer.serialize(self)
        return d

Do I need to change anything?

解决方案

Maybe having __public__ as a Job attribute is interfering with the way the filtering works. There's a warning in the Flask-Restless documentation about this.

这篇关于Flask搜索查询不使用过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆