【问题标题】:github3.py etag for conditional requestsgithub3.py etag 用于条件请求
【发布时间】:2014-05-06 20:54:38
【问题描述】:

我每次调用迭代器时都使用github3.py 传递etag 参数,例如:

user.iter_starred(etag='97ba89b5c009e5530f108a06606f3e2c')

为了避免消耗我的速率限制并执行conditional request。但无论如何,当我开始迭代时,github3 总是会执行正确的请求(因此会获取真实数据),将速率限制降低 1。

我做错了什么还是一个错误?

【问题讨论】:

    标签: python etag github3.py


    【解决方案1】:

    根据我自己的实验,这似乎按预期工作:

    >>> import github3
    >>> u = github3.user('sigmavirus24')
    >>> u
    <User [sigmavirus24:Ian Cordasco]>
    >>> i = u.iter_starred()
    >>> i
    <GitHubIterator [-1, /users/sigmavirus24/starred]>
    >>> next(i)
    <Repository [functional-koans/clojure-koans]>
    >>> i.etag
    '"1aeaaa7a249610c52ba0363009afcab9"'
    >>> next(u.iter_starred(etag=i.etag))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "github3/structs.py", line 103, in next
        return self.__next__()
      File "github3/structs.py", line 90, in __next__
        return next(self.__i__)
    StopIteration
    

    我们的示例之间的区别在于您的 etag 值是 '97ba89b5c009e5530f108a06606f3e2c',而我的等价物是 '"97ba89b5c009e5530f108a06606f3e2c"'。由于这个值放在标题中,我认为标题很重要:

    If-None-Match: "97ba89b5c009e5530f108a06606f3e2c"
    

    代替:

    If-None-Match: 97ba89b5c009e5530f108a06606f3e2c
    

    您将发送什么。

    我刚刚检查了一下,这就是问题所在。图书馆按预期工作。您传递 etag 值的方式是错误的。它需要在值周围加上双引号(例如,'"97ba89b5c009e5530f108a06606f3e2c"')才能正常工作。

    【讨论】:

    • 我不明白。您说我们需要传递类似于以下格式的 etag:'"97ba89b5"' 但这正是 i.etag 中包含的内容,那么当您将其作为参数传递时它为什么会抛出错误 u.iter_starred(etag=i.etag) 而不是 u.iter_starred(etag='"97ba89b5"') ?它们应该是完全相同的
    • 顺便说一句,它们都不适合我,如果我通过i.etag,我会收到与您遇到的错误类似的错误。如果我传递一个与 '"97ba89b5"' 相似的字符串,我每次都会用新的 etag 取回资源
    • 错误是预期的行为。这意味着请求已完成,并且不会返回任何内容。如果我去为一个新的存储库加星标,它只会返回那个存储库。
    猜你喜欢
    • 2015-09-28
    • 2015-12-27
    • 2019-06-24
    • 2021-01-21
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多