代码之家  ›  专栏  ›  技术社区  ›  Tom

python的url生成器

  •  10
  • Tom  · 技术社区  · 16 年前

    我知道 urllib urlparse ,但我想确保我不会重新发明轮子。

    图书馆我基本上希望能够生成URL(作为字符串)用于不同的路径和查询参数。我希望有些东西可能有如下语法:

    url_builder = UrlBuilder("some.domain.com")
    # should give me "http://some.domain.com/blah?foo=bar
    url_i_need_to_hit = url_builder.withPath("blah").withParams("foo=bar")  # maybe a ".build()" after this
    

    基本上,我希望能够存储传递给的默认值 urlparse.urlunsplit

    这样的东西存在吗?人们是否认为值得一起投入?

    4 回复  |  直到 16 年前
        1
  •  4
  •   S.Lott    16 年前

    你是在提议延长合同期限吗 http://docs.python.org/library/urlparse.html#urlparse.urlunparse

    你是在说这样的事吗?

    def myUnparse( someTuple, scheme=None, netloc=None, path=None, etc. ):
        parts = list( someTuple )
        if scheme is not None: parts[0] = scheme
        if netloc is not None: parts[1]= netloc
        if path is not None: parts[2]= path
        etc.
        return urlunparse( parts )
    

    class URLBuilder( object ):
        def __init__( self, base ):
            self.parts = list( urlparse(base) )
        def __call__( self, scheme=None, netloc=None, path=None, etc. ):
            if scheme is not None: self.parts[0] = scheme
            if netloc is not None: self.parts[1]= netloc
            if path is not None: self.parts[2]= path
            etc.
            return urlunparse( self.parts )
    
    bldr= URLBuilder( someURL )
    print bldr( scheme="ftp" )
    

    像这样的?

        2
  •  4
  •   octopusgrabbus ufukgun    13 年前

    furl 因为这也许能满足你的需要。

        3
  •  3
  •   S.Lott    16 年前

    还是不太确定你在找什么。。。但我会试一试。如果您只是想创建一个保留默认值的类,那么创建自己的类并像Python一样使用Python魔术就足够简单了 . 下面是一个略过的示例(次优):

    class UrlBuilder:
        def __init__(self,domain,path="blah",params="foo=bar"):
            self.domain = domain
            self.path = path
            self.params = params
    
        def withPath(self,path):
            self.path = path
            return self
    
        def withParams(self,params):
            self.params = params
            return self
    
        def __str__(self):
            return 'http://' + self.domain + '/' + self.path + '?' + self.params
            # or return urlparse.urlunparse( ( "http", self.domain, self.path, self.params, "", "" )
    
        def build(self):
            return self.__str__()
    
    if __name__ == '__main__':
        u = UrlBuilder('www.example.com')
        print u.withPath('bobloblaw')
        print u.withParams('lawyer=yes')
        print u.withPath('elvis').withParams('theking=true')
    

    如果您正在寻找更多的Builder设计模式,那么 Wikipedia article has a reasonable Python example (以及 Java ).

        4
  •  1
  •   Scott Smith    9 年前

    http://pythonhosted.org/uritools/ .

    文档中的示例:

    parts = urisplit('foo://user@example.com:8042/over/there?name=ferret#nose')
    
    orig_uri = uriunsplit(parts)
    

    拆分值是命名元组,而不是常规列表。可通过名称或索引访问:

    assert(parts[0] == parts.schema)
    assert(parts[1] == parts.authority)
    assert(parts[2] == parts.path)
    assert(parts[3] == parts.query)
    assert(parts[4] == parts.fragment)
    

    复制以进行更改:

    new_parts = [part for part in parts]
    new_parts[2] = "/some/other/path"
    new_uri = uriunsplit(new_parts)
    
    推荐文章