Coder Social home page Coder Social logo

Comments (8)

elliotgao2 avatar elliotgao2 commented on September 27, 2024 1

目前我的设想:

class MovieList(Item):
    __base_url = 'http://www.dy2018.com

    url = XPath('//b//a[@class="ulink"]/@href')
    title = XPath('//b//a[@class="ulink"]/text()')

    class Meta:
        source = XPath('//table[@class="tbspan"]')
        route = '/html/gndy/dyzz/index_:page.html'
        alias = '/movies/?page=:page'

class Movie(Item):
    __base_url = 'http://www.dy2018.com'

    download = XPath('//*[@id="Zoom"]/table[1]//a/text()')

    class Meta:
        source = None
        alias = '/movies/:id'
        route = '/i/:id.html'

class Post(Item):
    __base_url = 'https://news.ycombinator.com'

    url = XPath('//a[@class="storylink"][1]/@href')
    title = XPath('//a[@class="storylink"][1]/text()')

    class Meta:
        source = XPath('//tr[@class="athing"]')
        route = '/news/?p=:page'
        alias = '/posts/?page=:page'

对外只暴露alias定义的路径, route只作为源站路径. 上面的例子暴露

/movies/?page=:page
/movies/:id
/posts/?page=:page

路径的定义按照flask route的语法. 这样不但隐藏了源站, 还使得暴露的API接口遵循RESTful风格, 当然, 开发者可以使用任何喜欢的风格.

你觉得这样解决如何?

from toapi.

ruter avatar ruter commented on September 27, 2024

bravo!

一举两得,而且可以更加 RESTful,同时改进源站的路由写法,不用写正则去匹配特殊情况

另外提一点,源站路由用正则可以匹配多种规则的路由,如 route = '[/search/?q=.+|/page/?p=\d+]' 可以在一个 item 中匹配路由 /search/page,如果上面提到的参照 flask route 的源站路由写法能实现,请考虑到这种情况 @gaojiuli

from toapi.

elliotgao2 avatar elliotgao2 commented on September 27, 2024

想到一种更好的解决方案: #77

@ruter

from toapi.

ruter avatar ruter commented on September 27, 2024

今天尝试写实例的时候就遇到这个需求,分别有如下item:

  • page 获取next_page
  • post 获取page中的所有条目
  • search 获取搜索结果

完成上述page和post两个item的编写之后,我在编写对应站点的搜索(search)时发现,搜索结果页的内容和page的是一样的,这样我其实可以直接用page和post而不是重新写一个search item,然后在这个item里写我要获取的page和post,而直接使用page和post的前提就是多路由匹配。

不知道这样描述能不能说清楚问题的关键。

from toapi.

elliotgao2 avatar elliotgao2 commented on September 27, 2024

明白你的意思。

我那个issue提出的方案应该能兼容你的这个情况。你有什么更好的建议或者更进一步建议么?

from toapi.

howie6879 avatar howie6879 commented on September 27, 2024

@ruter 你完全可以自定义一个search的路由到post和page ,但这个issue #77 是可以简化操作的,你的search/ 可以关联到page这个item

from toapi.

ruter avatar ruter commented on September 27, 2024

抱歉刚看到前面新开的issue, #77 里的方案确实可以解决我所提出的问题。

另外说一种方案,仅供参考,这是框架 Odoo 中使用的多路由方案:

只有一个路由的时候是直接写路由路径 @http.route('/resource/path/<param>', ...),多路由的时候是以一个 list 的方式 @http.route(['/resource/foo/<param>', '/resource/bar/<param>'], ...)

这个 issue 应该可以关闭了 👍

from toapi.

elliotgao2 avatar elliotgao2 commented on September 27, 2024

他的多路由不存在映射的问题,我们需要映射。

from toapi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.