سؤال

وأنا لا يمكن أن يبدو لمعرفة كيفية الوصول إلى البانات باستخدام WSGI. حاولت المثال على موقع wsgi.org وأنه لم يعمل. أنا باستخدام بايثون 3.0 في الوقت الحالي. من فضلك لا نوصي إطار WSGI كما أن ليس ما أبحث عنه.

وأود أن معرفة كيفية الحصول عليها إلى كائن fieldstorage.

هل كانت مفيدة؟

المحلول

وعلى افتراض انك تحاول مجرد الحصول على بيانات الوظائف إلى كائن FieldStorage:

# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
    fp=env['wsgi.input'],
    environ=post_env,
    keep_blank_values=True
)

نصائح أخرى

body= ''  # b'' for consistency on Python 3.0
try:
    length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
    length= 0
if length!=0:
    body= environ['wsgi.input'].read(length)

لاحظ أن WSGI لم يتم حتى الآن تحديد كامل لبيثون 3.0، وجزء كبير من البنية التحتية WSGI شعبية لم يتم تحويل (أو تم 2to3d، ولكن لم يتم اختباره بشكل صحيح). (حتى وwsgiref.simple_server لا تعمل.) كنت في لوقت عصيب القيام WSGI على 3.0 اليوم.

وهذا عمل بالنسبة لي (في بيثون 3.0):

import urllib.parse

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)

وحتى أقصر

l = int(env.get('CONTENT_LENGTH')) if env.get('CONTENT_LENGTH') else 0
body = env['wsgi.input'].read(l) if l > 0 else ''

وهذا الرمز يعمل في الإنتاج.

وأود أن أقترح عليك أن ننظر في كيف تفعل بعض الأطر ذلك على سبيل المثال. (أنا لا توصي أي واحد، فقط استخدامها كمثال).

وهنا هو رمز من WERKZEUG :

http://dev.pocoo.org/projects /werkzeug/browser/werkzeug/wrappers.py#L150

والتي تدعو

http://dev.pocoo.org/projects /werkzeug/browser/werkzeug/utils.py#L1420

وانها معقدة بعض الشيء لتلخيص هنا، ولذا فإنني لن تفعل ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top