اذهب إلى المحتوى

السؤال

نشر

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

هنا شكل البيانات بعد أن يتم جلبها من قاعدة البيانات:

history = [
    ('/login', 	datetime(2022, 3, 4, 3, 38)),
    ('/', 		datetime(2022, 3, 4, 3, 38)),
    ('/order', 	datetime(2022, 3, 4, 3, 39)),
    ('/logout', datetime(2022, 3, 4, 3, 42))
]

كيف أقوم بإنشاء ملف CSV برمجيًا من البيانات السابقة؟ وكيف أسمح للمستخدم بتحميل الملف؟

Recommended Posts

  • 1
نشر

قم بإنشاء البياننات باستخدام الدالة writer من الوحدة csv واحفظها في الذاكرة باستخدام StringIO وبعدها قُم بإرسالها للمُستخدم على شكل ملف csv قابل للتحميل:

import csv # نقوم باستدعاء الوحدة csv 

from flask import Flask
from io import StringIO
from werkzeug.wrappers import Response

app = Flask(__name__)

@app.route('/')
def download_history():
    
    def generate():
        """
         هذه الدالة تسمح بإنشاء البيانات على شكل 
         CSV
        """
        data = StringIO()
        
        w = csv.writer(data)
        
        # إنشاء البيانات التي نُريد إرسالها للمُستخدم
        history = [
            ('/login', 	datetime(2022, 3, 4, 3, 38)),
            ('/'	 , 	datetime(2022, 3, 4, 3, 38)),
            ('/order', 	datetime(2022, 3, 4, 3, 39)),
            ('/logout', datetime(2022, 3, 4, 3, 42))
        ]

        # حفظ البيانات داخل ملف
        # CSV
        for item in history:
            w.writerow((
                item[0],
                item[1].isoformat()  # تنسيق التاريخ كسلسلة نصية
            ))
            yield data.getvalue()
            data.seek(0)
            data.truncate(0)

    # إرسال البيانات للمُستخدم لتحميلها
    response = Response(generate(), mimetype='text/csv')
    # الملف اسمه  
    # history.csv
    response.headers.set("Content-Disposition", "attachment", filename="history.csv")
    return response

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...