الجمعة، 27 ديسمبر 2019

برمجة واجهة البوابة المشتركة بايثون بيثون Python CGI Programming

برمجة واجهة البوابة المشتركة بايثون بيثون Python  CGI Programming

برمجة واجهة البوابة المشتركة بايثون بيثون Python  CGI Programming

واجهة Common Gateway Interface ، أو CGI ، هي مجموعة من المعايير التي تحدد كيفية تبادل المعلومات بين خادم الويب والنص البرمجي المخصص.  يتم الحفاظ على مواصفات CGI حاليًا بواسطة NCSA.

What is CGI?

  • تعد واجهة Common Gateway Interface أو CGI معيارًا لبرامج العبّارة الخارجية للتفاعل مع خوادم المعلومات مثل خوادم HTTP.

     الإصدار الحالي هو CGI / 1.1 و CGI / 1.2 قيد التقدم.

     تصفح الويب
     لفهم مفهوم CGI ، دعونا نرى ما يحدث عندما نقر على رابط تشعبي لتصفح صفحة ويب معينة أو عنوان URL.

     يتصل المستعرض بخادم الويب HTTP ويطلب عنوان URL ، أي اسم الملف.

     خادم ويب يوزع URL ويبحث عن اسم الملف.  إذا عثر على هذا الملف ، فإنه يعيده إلى المتصفح ، وإلا فإنه يرسل رسالة خطأ تشير إلى أنك طلبت ملفًا خاطئًا.

     يستعرض متصفح الويب استجابة من خادم الويب ويعرض إما الملف المستلم أو رسالة الخطأ.

     ومع ذلك ، من الممكن إعداد خادم HTTP بحيث عندما يتم طلب ملف في دليل معين ، لا يتم إرسال الملف مرة أخرى ؛  بدلاً من ذلك ، يتم تنفيذه كبرنامج ، وأيًا كانت مخرجات البرنامج يتم إرسالها مرة أخرى ليتم عرضها في المتصفح.  تسمى هذه الوظيفة واجهة البوابة العامة أو CGI وتسمى البرامج نصوص CGI.  يمكن أن تكون برامج CGI هذه عبارة عن برنامج Python Script أو PERL Script أو Shell Script أو C أو C ++ ، إلخ.

مخطط المعمارية CGI Architecture Diagram

CGI Architecture

خادم الويب الدعم والتكوين

 قبل متابعة برمجة CGI ، تأكد من أن خادم الويب الخاص بك يدعم CGI وأنه قد تم تكوينه للتعامل مع برامج CGI.  يتم الاحتفاظ بجميع برامج CGI التي سيتم تنفيذها بواسطة خادم HTTP في دليل تم تكوينه مسبقًا.  يُطلق على هذا الدليل دليل المجموعة الاستشارية لاندونيسيا (CGI Directory) ويُسمى بالاسم / var / www / cgi-bin.  حسب الاتفاقية ، ملفات CGI لها امتداد باسم.  cgi ، ولكن يمكنك الاحتفاظ بملفاتك مع python extension .py أيضًا.


 افتراضيًا ، يتم تكوين خادم Linux لتشغيل البرامج النصية فقط في دليل cgi-bin في / var / www.  إذا كنت تريد تحديد أي دليل آخر لتشغيل البرامج النصية لـ CGI ، فقم بتعليق الأسطر التالية في ملف httpd.conf -

 "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all

 "/var/www/cgi-bin">
Options All

هنا ، نفترض أن لديك Web Server قيد التشغيل بنجاح وأنك قادر على تشغيل أي برنامج CGI آخر مثل Perl أو Shell ، إلخ.

 أول برنامج CGI
 هنا رابط بسيط ، مرتبط بنص CGI يسمى hello.py.  يتم الاحتفاظ بهذا الملف في دليل / var / www / cgi-bin ويحتوي على المحتوى التالي.  قبل تشغيل برنامج CGI ، تأكد من تغيير وضع الملف باستخدام chmod 755 hello.py UNIX الأمر لجعل الملف قابل للتنفيذ.
#!/usr/bin/python

print "Content-type:text/html\r\n\r\n"
print ''
print ''
print 'Hello Word - First CGI Program'
print '
' print '' print '

Hello Word! This is my first CGI program

' print '' print ''
If you click hello.py, then this produces the following output −

Hello Word! This is my first CGI program

هذا البرنامج النصي hello.py هو برنامج نصي Python بسيط ، يكتب إخراجه في ملف STDOUT ، أي الشاشة.  هناك ميزة هامة وإضافية متوفرة وهي السطر الأول الذي سيتم طباعته. نوع المحتوى: text / html \ r \ n \ r \ n.  يتم إرسال هذا الخط مرة أخرى إلى المتصفح ويحدد نوع المحتوى الذي سيتم عرضه على شاشة المتصفح.


 الآن يجب أن تكون قد فهمت المفهوم الأساسي لـ CGI ويمكنك كتابة العديد من برامج CGI المعقدة باستخدام Python.  يمكن لهذا البرنامج النصي التفاعل مع أي نظام خارجي آخر لتبادل المعلومات مثل RDBMS.

HTTP Header

السطر Content-type: text / html \ r \ n \ r \ n هو جزء من رأس HTTP الذي يتم إرساله إلى المتصفح لفهم المحتوى.  سيكون كل رأس HTTP في النموذج التالي -
HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

هناك بعض رؤوس HTTP المهمة الأخرى التي ستستخدمها بشكل متكرر في برمجة CGI.
الرفمالعنوان والوصف
1
Content-type:
سلسلة MIME تحدد تنسيق الملف الذي يتم إرجاعه.  المثال هو نوع المحتوى: text / html
2
Expires: Date
التاريخ الذي تصبح فيه المعلومات غير صالحة.  يتم استخدامه من قبل المتصفح لتحديد متى يجب تحديث الصفحة.  سلسلة تاريخ صالحة بالتنسيق 01 Jan 1998 12:00:00 GMT.
3
Location: URL
عنوان URL الذي يتم إرجاعه بدلاً من عنوان URL المطلوب.  يمكنك استخدام هذا الحقل لإعادة توجيه طلب إلى أي ملف.
4
Last-modified: Date
تاريخ التعديل الأخير للمورد.
5
Content-length: N
طول البيانات التي يتم إرجاعها بالبايت.  يستخدم المستعرض هذه القيمة للإبلاغ عن وقت التنزيل المقدّر للملف.
6
Set-Cookie: String
تعيين ملف تعريف الارتباط الذي تم تمريره عبر السلسلة

CGI Environment Variablesمتغيرات البيئة 

 البرامج لديها حق الوصول إلى متغيرات البيئة التالية.  تلعب هذه المتغيرات دورًا مهمًا أثناء كتابة أي برنامج CGI.  CGI 
الرقم.اسم المتغير والوصف
1
CONTENT_TYPE
نوع بيانات المحتوى.  يستخدم عندما يرسل العميل محتوى مرفقًا إلى الخادم.  على سبيل المثال ، تحميل الملف.
2
CONTENT_LENGTH
طول معلومات الاستعلام.  وهي متوفرة فقط لطلبات POST.
3
HTTP_COOKIE
تُرجع مجموعة ملفات تعريف الارتباط في شكل زوج مفاتيح وقيمة.
4
HTTP_USER_AGENT
يحتوي حقل رأس طلب وكيل المستخدم على معلومات حول وكيل المستخدم الذي أنشأ الطلب.  إنه اسم متصفح الويب.
5
PATH_INFO
مسار البرنامج النصي CGI.
6
QUERY_STRING
المعلومات المشفرة URL التي يتم إرسالها مع طلب أسلوب GET.
7
REMOTE_ADDR
عنوان IP الخاص بالمضيف البعيد الذي يقوم بإجراء الطلب.  هذا تسجيل مفيد أو للمصادقة.
8
REMOTE_HOST
اسم المضيف المؤهل بالكامل الذي يقوم بتقديم الطلب.  إذا كانت هذه المعلومات غير متوفرة ، فيمكن استخدام REMOTE_ADDR للحصول على عنوان IR.
9
REQUEST_METHOD
الطريقة المستخدمة لتقديم الطلب.  الطرق الأكثر شيوعًا هي GET و POST.
10
SCRIPT_FILENAME
المسار الكامل إلى البرنامج النصي CGI.
11
SCRIPT_NAME
اسم البرنامج النصي CGI.
12
SERVER_NAME
اسم مضيف الخادم أو عنوان IP
13
SERVER_SOFTWARE
اسم البرنامج الذي يعمل عليه الخادم وإصداره.
هنا برنامج CGI صغير لسرد جميع متغيرات CGI.  انقر على هذا الرابط لرؤية النتيجة الحصول على البيئة
#!/usr/bin/python

import os

print "Content-type: text/html\r\n\r\n";
print "Environment<\br>";
for param in os.environ.keys():
   print "%20s: %s<\br>" % (param, os.environ[param])

GET and POST Methods دالة القراءة والاسناد 

يجب أن تكون قد واجهت العديد من المواقف عندما تحتاج إلى تمرير بعض المعلومات من المستعرض الخاص بك إلى خادم الويب وفي النهاية إلى برنامج CGI الخاص بك.  في أغلب الأحيان ، يستخدم المستعرض طريقتين لنقل هذه المعلومات إلى خادم الويب.  هذه الطرق هي طريقة GET وطريقة POST.

Passing Information using GET method

تقوم طريقة GET بإرسال معلومات المستخدم المشفرة الملحقة بطلب الصفحة.  يتم فصل الصفحة والمعلومات المشفرة بواسطة؟  شخصية على النحو التالي -
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
طريقة GET هي الطريقة الافتراضية لتمرير المعلومات من المستعرض إلى خادم الويب وتنتج سلسلة طويلة تظهر في المربع الموقع: المستعرض الخاص بك.  لا تستخدم أبدًا طريقة GET إذا كانت لديك كلمة مرور أو معلومات حساسة أخرى لتمريرها إلى الخادم.  تحتوي طريقة GET على قيود الحجم: يمكن إرسال 1024 حرفًا فقط في سلسلة الطلب.  ترسل طريقة GET المعلومات باستخدام رأس QUERY_STRING وسيتم الوصول إليها في برنامج CGI من خلال متغير البيئة QUERY_STRING.

 يمكنك تمرير المعلومات ببساطة عن طريق سلسلة المفاتيح وأزواج القيمة إلى جانب أي عنوان URL أو يمكنك استخدام HTML

 علامات لتمرير المعلومات باستخدام طريقة GET.

Simple URL Example:Get Method مثال بسيط

فيما يلي عنوان URL بسيط ، يمرر قيمتين إلى برنامج hello_get.py باستخدام طريقة GET.
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI
أدناه هو hello_get.py النصي للتعامل مع المدخلات المقدمة من قبل متصفح الويب.  سنستخدم وحدة CGI ، مما يجعل الوصول إلى المعلومات التي تم تمريرها من السهل جدًا -
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Hello - Second CGI Program"
print "
" print "" print "

Hello %s %s

" % (first_name, last_name) print "" print ""
هذا من شأنه أن يولد النتيجة التالية -

Hello ZARA ALI

Simple FORM Example:GET Method

يمرر هذا المثال قيمتين باستخدام HTML FORM وزر الإرسال.  نحن نستخدم نفس النص CGI hello_get.py للتعامل مع هذا الإدخال.
action = "/cgi-bin/hello_get.py" method = "get"> First Name: type = "text" name = "first_name"> /> Last Name: type = "text" name = "last_name" /> type = "submit" value = "Submit" />
فيما يلي الإخراج الفعلي للنموذج أعلاه ، حيث تقوم بإدخال الاسم الأول والاسم الأخير ، ثم انقر فوق زر "إرسال" لرؤية النتيجة.
First Name: 
Last Name:  

Passing Information Using POST Methodتمرير المعلومات باستخدام 

طريقة موثوق بها عمومًا لنقل المعلومات إلى برنامج CGI هي طريقة POST.  هذا يحزم المعلومات بنفس طريقة GET تمامًا ، ولكن بدلاً من إرسالها كسلسلة نصية بعد a؟  في عنوان URL ، يرسله كرسالة منفصلة.  تأتي هذه الرسالة في البرنامج النصي CGI في شكل الإدخال القياسي.

 يوجد أدناه نص hello_get.py الذي يتعامل مع GET وكذلك طريقة POST.
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Hello - Second CGI Program"
print "
" print "" print "

Hello %s %s

" % (first_name, last_name) print "" print ""
لنأخذ مرة أخرى نفس المثال الوارد أعلاه والذي يمرر قيمتين باستخدام HTML FORM وزر الإرسال.  نحن نستخدم نفس النص CGI hello_get.py للتعامل مع هذا الإدخال.
action = "/cgi-bin/hello_get.py" method = "post"> First Name: type = "text" name = "first_name"> /> Last Name: type = "text" name = "last_name" /> type = "submit" value = "Submit" />

هنا هو الإخراج الفعلي للنموذج أعلاه.  أدخل الاسم الأول والاسم الأخير ، ثم انقر فوق زر "إرسال" لرؤية النتيجة.
First Name: 
Last Name:  

Passing Checkbox Data to CGI Program

تمرير بيانات مربعات الاختيار في برنامج cgi
يتم استخدام مربعات الاختيار عند الحاجة إلى تحديد أكثر من خيار.

 فيما يلي مثال لتعليمة HTML البرمجية للنموذج الذي يحتوي على خانتي اختيار -
action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank"> type = "checkbox" name = "maths" value = "on" /> Maths type = "checkbox" name = "physics" value = "on" /> Physics type = "submit" value = "Select Subject" />
نتيجة هذا الكود هو النموذج التالي -
 Maths  Physics 
أدناه هو checkbox.cgi النصي للتعامل مع المدخلات المقدمة من قبل متصفح الويب لزر مربع الاختيار.
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('maths'):
   math_flag = "ON"
else:
   math_flag = "OFF"

if form.getvalue('physics'):
   physics_flag = "ON"
else:
   physics_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Checkbox - Third CGI Program"
print "
" print "" print "

CheckBox Maths is : %s

" % math_flag print "

CheckBox Physics is : %s

" % physics_flag print "" print ""

Passing Radio Button Data to CGI Program تمرير بيانات زر الدائري  الاختيار الأحادي إلى برنامج واجهة البوابة العامة

تُستخدم أزرار الاختيار عند تحديد خيار واحد فقط.

 فيما يلي مثال لرمز HTML لنموذج به زران لاختيار الاحادي -
action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank"> type = "radio" name = "subject" value = "maths" /> Maths type = "radio" name = "subject" value = "physics" /> Physics type = "submit" value = "Select Subject" />
ناتج هذا الكود هو النموذج التالي -
 Maths  Physics 
يوجد أدناه برنامج نصي radiobutton.py للتعامل مع المدخلات التي يوفرها متصفح الويب لزر الراديو -
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Not set"

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Radio - Fourth CGI Program"
print "
" print "" print "

Selected Subject is %s

" % subject print "" print ""

Passing Text Area Data to CGI Program

تمرير بيانات مساحة النص إلى برنامج واجهة البوابة العامة او المشتركة في بايثون بيثون
يتم استخدام عنصر TEXTAREA عند تمرير نص متعدد الأسطر إلى برنامج CGI.
 فيما يلي مثال لتعليمة برمجية HTML لنموذج مع مربع TEXTAREA -
action = "/cgi-bin/textarea.py" method = "post" target = "_blank"> type = "submit" value = "Submit" />
نتيجة هذا الكود هو النموذج التالي -
فيما يلي نص textarea.cgi للتعامل مع المدخلات التي يوفرها متصفح الويب -
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "Not entered"

print "Content-type:text/html\r\n\r\n"
print ""
print "";
print "Text Area - Fifth CGI Program"
print "
" print "" print "

Entered Text Content is %s

" % text_content print ""

Passing Drop Down Box Data to CGI Program تمرير بيانات مربع القائمة المنسدلة إلى برنامج الواجهة البوابة المشتركة 

يتم استخدام مربع القائمة المنسدلة عندما يكون لدينا العديد من الخيارات المتاحة ولكن سيتم اختيار واحد أو اثنين فقط.

 فيما يلي مثال لتعليمات HTML البرمجية الخاصة بالنموذج الذي يحتوي على مربع منسدل واحد -
action = "/cgi-bin/dropdown.py" method = "post" target = "_blank"> type = "submit" value = "Submit"/>
نتيجة هذا الكود هو النموذج التالي -
 
يوجد أدناه برنامج نصي المنسدلة dropdown.py للتعامل مع المدخلات المقدمة بواسطة متصفح الويب.
#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not entered"

print "Content-type:text/html\r\n\r\n"
print ""
print ""
print "Dropdown Box - Sixth CGI Program"
print "
" print "" print "

Selected Subject is %s

" % subject print "" print ""

Using Cookies in CGI استخدام ملفات تعريف الارتباط في الواجهة البوابة المشتركة

بروتوكول HTTP هو بروتوكول أمن لنقل البيانات خلال الشبكة عن طريق الانترنت   بالنسبة لموقع ويب تجاري ، يلزم الحفاظ على معلومات الجلسة بين الصفحات المختلفة.  على سبيل المثال ، ينتهي تسجيل مستخدم واحد بعد إكمال العديد من الصفحات.  كيفية الحفاظ على معلومات جلسة المستخدم عبر جميع صفحات الويب؟

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

كيف تعمل الكوكيز في بايثون بيثون  How It Works?

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

 ملفات تعريف الارتباط هي سجل بيانات نص عادي يتكون من 5 حقول متغيرة الطول -
  • Expires − تاريخ انتهاء صلاحية ملف تعريف الارتباط.  إذا كان هذا فارغًا ، فستنتهي صلاحية ملف تعريف الارتباط عندما يغادر الزائر المتصفح.
  • Domain − اسم مجال موقعك.
  • Path − المسار إلى الدليل أو صفحة الويب التي تحدد ملف تعريف الارتباط.  قد يكون هذا فارغًا إذا كنت ترغب في استرداد ملف تعريف الارتباط من أي دليل أو صفحة.
  • Secure − إذا كان هذا الحقل يحتوي على كلمة "آمنة" ، فقد يتم استرجاع ملف تعريف الارتباط فقط مع خادم آمن.  إذا كان هذا الحقل فارغًا ، فلا يوجد مثل هذا التقييد.
  • Name=Value − يتم تعيين ملفات تعريف الارتباط واسترجاعها في شكل أزواج مفاتيح وقيمة.

إعداد ملفات تعريف الارتباط Setting up Cookies

من السهل جدًا إرسال ملفات تعريف الارتباط إلى المتصفح.  يتم إرسال ملفات تعريف الارتباط هذه إلى جانب رأس HTTP من قبل إلى حقل نوع المحتوى.  على افتراض أنك تريد تعيين معرف المستخدم وكلمة المرور كملفات تعريف ارتباط.  يتم إعداد ملفات تعريف الارتباط على النحو التالي -
#!/usr/bin/python

print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

من هذا المثال ، يجب أن تكون قد فهمت

 كيفية تعيين ملفات تعريف الارتباط.  نحن نستخدم رأس Set-CookieHTTP لتعيين ملفات تعريف الارتباط.

 من الاختياري تعيين سمات ملفات تعريف الارتباط مثل انتهاء الصلاحية والمجال والمسار.  من الجدير بالذكر أنه تم تعيين ملفات تعريف الارتباط قبل إرسال الخط السحري "نوع المحتوى: نص / html \ r \ n \ r \ n.

استرداد ملفات تعريف الارتباط  Retrieving Cookies


من السهل جدًا استرجاع جميع ملفات تعريف الارتباط المحددة.  يتم تخزين ملفات تعريف الارتباط في متغير البيئة CGI HTTP_COOKIE وسيكون لها النموذج التالي -
key1 = value1;key2 = value2;key3 = value3....

فيما يلي مثال على كيفية استرداد ملفات تعريف الارتباط.
#!/usr/bin/python

# Import modules for CGI handling 
from os import environ
import cgi, cgitb

if environ.has_key('HTTP_COOKIE'):
   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
      (key, value ) = split(cookie, '=');
      if key == "UserID":
         user_id = value

      if key == "Password":
         password = value

print "User ID  = %s" % user_id
print "Password = %s" % password

ينتج عن ذلك النتيجة التالية لملفات تعريف الارتباط التي تم تعيينها بواسطة البرنامج النصي أعلاه -
User ID = XYZ
Password = XYZ123

مثال على رفع الملفات في بايثون بيثون File Upload Example

لتحميل ملف ، يجب أن يحتوي نموذج HTML على سمة enctype لتعيين بيانات متعددة الأجزاء / النماذج.  تنشئ علامة الإدخال بنوع الملف زر "استعراض".


   
enctype = "multipart/form-data" action = "save_file.py" method = "post"> File: type = "file" name = "filename" />
type = "submit" value = "Upload" />

نتيجة هذا الكود هو النموذج التالي -
File: 
المثال أعلاه تم تعطيله عمداً لحفظ الأشخاص الذين يقومون بتحميل الملف على خادمنا ، ولكن يمكنك تجربة الرمز أعلاه مع الخادم الخاص بك.

 فيما يلي النص save_file.py لمعالجة تحميل الملفات -
#!/usr/bin/python

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Get filename here.
fileitem = form['filename']

# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n


   %s




""" % (message,)
إذا قمت بتشغيل البرنامج النصي أعلاه على نظام التشغيل Unix / Linux ، فأنت بحاجة إلى الاهتمام باستبدال فاصل الملفات على النحو التالي ، وإلا يجب أن تعمل عبارة windows machine الموجودة أعلى open ().
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

How To Raise a "File Download" Dialog Box?

كيفية رفع مربع حوار "تنزيل الملف"؟
في بعض الأحيان ، من المستحسن أن ترغب في إعطاء خيار حيث يمكن للمستخدم النقر فوق ارتباط وسوف ينبثق مربع حوار "تنزيل الملف" للمستخدم بدلاً من عرض المحتوى الفعلي.  هذا سهل للغاية ويمكن تحقيقه من خلال رأس HTTP.  رأس HTTP هذا يختلف عن العنوان المذكور في القسم السابق.

 على سبيل المثال ، إذا كنت ترغب في جعل ملف FileName قابلاً للتحميل من ارتباط معين ، فسيكون بناء الجملة كما يلي -
#!/usr/bin/python

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go here.
fo = open("foo.txt", "rb")

str = fo.read();
print str

# Close opend file
fo.close()




التسميات: