Requests: لا يمكن إنشاء سلسلة استعلام URL بمعلمة بدون قيمة

تم إنشاؤها على ٢٥ يونيو ٢٠١٥  ·  32تعليقات  ·  مصدر: psf/requests

قد تحتوي سلسلة استعلام URL على معلمة ليس لها قيمة مثل http: // host / path /؟ foo أو http: // host / path /؟ a = 1 & foo. الطلبات حاليًا لا تقدم دعمًا لذلك.

In [68]: d
Out[68]: {'a': 1, 'foo': None}

In [69]: tl
Out[69]: [('a', 1), ('foo',)]

In [70]: RequestEncodingMixin._encode_params(d)
Out[70]: 'a=1'

In [71]: RequestEncodingMixin._encode_params(tl)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-71-5d4dac855108> in <module>()
----> 1 RequestEncodingMixin._encode_params(tl)

/home/f557010/jpm/local/lib/python2.7/site-packages/requests/models.pyc in _encode_params(data)
     87         elif hasattr(data, '__iter__'):
     88             result = []
---> 89             for k, vs in to_key_val_list(data):
     90                 if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
     91                     vs = [vs]

ValueError: need more than 1 value to unpack

متوقع:

'a=1&foo'
3.0 Breaking API Change Feature Request

التعليق الأكثر فائدة

في 3.0 ، أعتقد أنه يمكننا التفكير في جعل سلسلة فارغة لا تؤدي إلى =

ال 32 كومينتر

أستطيع أن أرى بعض القيمة في هذا. لأسباب تتعلق بواجهة برمجة التطبيقات ، يمكن أن تعمل فقط مع نهج "قائمة المجموعات" ، لكنني سأكون موافقًا على إضافة دعم لذلك. @ sigmavirus24؟

لا أعتقد أننا نستخدمه (حتى الآن) ولكن يبدو أن urllib3 يستخدم urlencode وكذلك نحن

إذا درسنا كيف يتصرف ذلك ، يمكنك أن ترى أنه لا يعجبه أي من الطرق المقترحة للعمل مع هذا. {'foo': None} سوف "يعمل" لكنه لا يفعل الشيء الصحيح. ربما هذا هو سبب تجنبنا هذا من قبل. ومع ذلك ، فإن RFC 3986 له ... تعريف فضفاض للغاية لجزء الاستعلام من URI ، لذلك في رأيي يجب أن نتعامل معه. بعد قولي هذا ، لست متأكدًا من وجود أي أدوات تسمح لنا بالتعامل معها بسهولة. = /

>>> u = urlparse.urlparse('http://example.com/foo?bar')
>>> u
ParseResult(scheme='http', netloc='example.com', path='/foo', params='', query='bar', fragment='')
>>> urlparse.parse_qs(u.query)
{}
>>> urllib.urlencode({'foo': None})
'foo=None'
>>> urllib.urlencode([('foo',)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 1336, in urlencode
    for k, v in query:
ValueError: need more than 1 value to unpack

ذات صلة: "urlencode لقيمة لا شيء يستخدم السلسلة 'بلا'" - https://bugs.python.org/issue18857

أعط إدخال @ piotr-dobrogost ، agilevic هل حاولت استخدام السلسلة الفارغة كقيمة هناك؟ هل يعمل مع خادم API الخاص بك؟

صدم. =)

>>> import requests
>>> r = requests.get('https://httpbin.org/get', params={'foo': ''})
>>> r.request.url
'https://httpbin.org/get?foo='

إنها ليست مثل وجود معلمة بدون قيمة. تقدمك علامة = بعد اسم المعلمة. ستعمل بعض التطبيقات ، ولكن من أجل توفير حل كامل ، يجب معالجة هذه الحالة بالضبط. أن urllib لا يفعل ذلك ليس له أهمية. تقوم الطلبات بأشياء كثيرة أفضل من المكتبات القياسية لـ HTTP - وهذا هو سبب وجودها.

agilevic ماذا سيكون تصميم API المقترح لهذه الميزة؟

هذه فكرة مجنونة:

>>> import requests
>>> r = requests.get('https://httpbin.org/get', params={'foo': None})
>>> r.request.url
'https://httpbin.org/get?foo'

هذا ما أعتقد أنه يجب أن يحدث.

ما الذي يحدث بالفعل:

'https://httpbin.org/get'

:(

frnhr لذا فإن السبب الذي لا يعمل مع API الخاص بنا هو أن تعيين مفتاح على None هو إشارة لـ "الرجاء إزالة هذا المفتاح من الخريطة". لدينا هذه الإشارة لأن بعض المعلمات يمكن أن تستمر في كائن Session نفسه ، ويريد المستخدمون أحيانًا أن يكونوا قادرين على منع هذه المعلمات على أساس كل طلب.

أخشى أنني لا أرى ما علاقة كائن الجلسة بهذا الجزء من واجهة برمجة التطبيقات ، بصدق. ولكن حسنًا ، ربما False بعد ذلك ، أو حتى بعض SpecialImportableObject بدلاً من None ؟

في 17 سبتمبر 2016 ، الساعة 07:47 ، كتب Cory Benfield [email protected] :

frnhr لذا فإن السبب الذي لا يعمل مع API الخاص بنا هو أن تعيين مفتاح على None هو إشارة "الرجاء إزالة هذا المفتاح من الخريطة". لدينا هذه الإشارة لأن بعض المعلمات يمكن أن تستمر في كائن Session نفسه ، ويريد المستخدمون أحيانًا أن يكونوا قادرين على منع هذه المعلمات على أساس كل طلب.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو اعرضها على GitHub ، أو قم بكتم صوت الموضوع.

frnhr واجهة برمجة التطبيقات Session API مناسبة لأن واجهة برمجة التطبيقات requests. مبنية على واجهة API Session : إنها مجموعة فرعية من هذه الوظيفة ، غلاف ملائم.

لذلك يمكننا بالتأكيد القيام بذلك ، لكنني لست متأكدًا إلى أي مدى يستحق العناء. عند عدم استخدام تعيين قيمة المفتاح ، يجب عليك فقط تمرير سلسلة إلى الحقل params : params="foo" .

ماذا لو قدمنا ​​حجة مكتوبة محددة يمكن أن تشير إلى الطلبات التي يجب إضافة المعلمة بدون قيمة؟

# defined somewhere in requests
class ValuelessParam(object):
    pass
....
....

params = {'foo': 'some_param', 'bar': requests.ValuelessParam()}

requests.get('http://something', params=params)

# url should be 'http://something?foo=some_param&bar'

إنه ليس لا شيء ، وليس ثابتًا عدديًا ... لذا يجب أن يكون متوافقًا مع الإصدارات السابقة. تحت غطاء محرك السيارة ... يمكننا التحقق من نوع القيمة هذا وإلحاق هذه المعلمة بشكل خاص بعنوان url الذي تم إنشاؤه.

لذا بينما سينجح ذلك بالتأكيد ، لا أعتقد أن واجهة برمجة التطبيقات ستتجاوز كينيث.

نعم ، لا. أفضل دعم مدمج مثل None ، ولست متأكدًا من أن هذه هي أفضل فكرة - لكنها يمكن أن تعمل بشكل جيد. False لن يفعل ذلك.

None أيضًا: يمنحه مصدر الشفرة بالفعل معنى "إلغاء تعيين القيمة المعينة على مستوى الجلسة.

سيكون هذا تغييرًا كبيرًا جدًا ، ولا أعتقد أنه سيفيد الكثير من الناس. ربما يمكن اعتبار tuple فارغ. (على سبيل المثال ، (,) .

لست متأكدًا مما إذا كان قد تم حل هذا الأمر ، لكنني وجدت أن هذا الموضوع يحاول فعل الشيء الدقيق المتمثل في إضافة مفتاح بدون قيمة. "QueryAll" في حالتي ، ولكن لدي عدد من الأسباب في RestAPI Automation للاستفادة من هذا النوع من الوظائف.

ماذا يحدث إذا مررت {'QueryAll': ''} ؟

أحصل على & QueryAll = في النهاية.

يبدو أن الأمر يتعلق بواجهة برمجة التطبيقات (API) حول كيفية تعاملها مع الفتح "=" ، ثم ، أخذتها واجهة برمجة تطبيقات PasswordState طالما كانت في نهاية قائمة المعلمات الخاصة بي ، إذا قمت بنقلها إلى البداية ، فقد تعرضت للخطأ.

في 3.0 ، أعتقد أنه يمكننا التفكير في جعل سلسلة فارغة لا تؤدي إلى =

سيكون ذلك رائعًا: - D حتى الآن ، يمكن أن يتحرك مشروع Passwordstate الخاص بي إلى الأمام باستخدام تنسيق QueryAll = في نهاية سلسلة معلمات teh لذا أعود إلى المسار الصحيح. سأشاهد هذا الموضوع: - د

شكرا كينيث!

لم أسمع أو أرى أي شيء حتى الآن ، ولكن لم أعود إلى الوراء لمعرفة ما إذا كان قد تم إصدار أي تحديثات.

نيك

من: Alex Zagoro [email protected]
تاريخ الإرسال: السبت 22 سبتمبر 2018 الساعة 10:19 صباحًا
إلى: طلبات / طلبات [email protected]
نسخة إلى: Ellson، Nick [email protected] ؛ التعليق [email protected]
الموضوع: Re: [الطلبات / الطلبات] لا يمكن إنشاء سلسلة استعلام URL بمعامل بدون قيمة (# 2651)

مهلا ، أي تحديثات على هذا؟

أنا أواجه هذه المشكلة في الوقت الحالي أيضًا. هل وجد أي شخص آخر أي طريقة للتغلب على هذه المشكلة؟

أعتقد أنه لا يوجد حتى الآن حل في الطلبات الخاصة بهذه الميزة البسيطة ولكنها شائعة جدًا. عجيب.

لسوء الحظ تواجه نفس المشكلة.
ألن يكون نمطًا أو خيارًا أفضل أن تكون قادرًا على حقن / تمرير مُنسق / مشفر مخصص اختياري أو علامة محددة للتعامل مع أي سلوك بلا؟

Lukasa يبدو أنك تعرف مصدر الشفرة أكثر من معظمنا ، ما رأيك في ذلك؟

ألن يتم حل هذا في تغيير غير منقطع ، @ kennethreitz؟ يمكن تعيين الإعدادات الافتراضية لتقليد سلوك 2.x.

يبدو أن هذا لا يزال يضيف = عندما يتم تمرير سلسلة فارغة. حان الوقت لعمل حل بديل!

لذا أعتقد أن هذا لا يزال يمثل مشكلة؟

إذا كانت لديك معلمات ليس لها قيمة ، فيمكنك إدراجها كجزء من عنوان url وسيتم إلحاق أي معلمات إضافية بـ & بدلاً من البدء بـ ? :

In [3]: r = requests.get("http://www.google.com", params={'test': 'true'})

In [4]: r.url
Out[4]: 'http://www.google.com/?test=true'

In [5]: r = requests.get("http://www.google.com?test2", params={'test': 'true'})

In [6]: r.url
Out[6]: 'http://www.google.com/?test2&test=true'

ماذا عن هذه القاعدة؟

{ key: undefined } إلى ? _ (غير مشمول) _
{ key: null } إلى ?key
{ key: '' } إلى ?key=
{ key: 'null' } إلى ?key=null

2020 ... وما زالت مشكلة .... SMH

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات