web-dev-qa-db-ja.com

lxml + Django + uwsgiが正しい形式のExcelファイルを生成できませんでしたか?

環境にlxmlをインストールすると、プロジェクトがuwsgiで開始したときに、生成されたExcelファイルを開くことができません。Django manage.py runserverおよびgunicornで正常に開くことができるためです。

以下のような私のメインコード:


── test_Excel
           ├── urls.py
           ├── wsgi.py
           └── settings.py

── manage.py


urls.py

from Django.contrib import admin
from Django.urls import path
from Django.views import View
from openpyxl.writer.Excel import save_virtual_workbook
import pandas as pd
from Django.http import HttpResponse, StreamingHttpResponse


import xlrd
import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
from openpyxl.writer.Excel import save_virtual_workbook
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE



class TestExcelView(View):
    def get(self, request):
        # indexs = {0: ['cost', '2020-01', 'testing'],
        #           1: ['cost', '2020-01', '360 Limited'],
        #           2: ['cost', '2020-02', 'Korea Co.,LTD'],
        #           3: ['cost', '2020-02', 'ADS4EACH HK TECH LIMITED']}
        # columns = [['1'], ['amy'], ['tom'], ['zara'], ['jay'], ['Lee'], ['Uzi'], ['Zome'], ['Qoe'], ['Aoi'], ['Yeezy'],
        #            ['Hazy'], ['Wash'], ['pany'], ['zoey'], ['Moe'], ['total']]
        # datas = {
        #     0: [0.0, 0.0, 0.0, 0.0, 0.0, 7.85, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.85],
        #     1: [0.0, 0.0, 0.0, 0.0, 0.0, 7.85, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.85],
        #     2: [0.0, 0.0, 0.0, 0.0, 0.0, 7.85, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.85],
        #     3: [0.0, 0.0, 0.0, 0.0, 0.0, 7.85, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 7.85]
        # }
        #
        # index = pd.MultiIndex.from_tuples(indexs.values())
        # column = pd.MultiIndex.from_tuples(columns)
        # data = datas.values()
        #
        # df = pd.DataFrame(data, index=index, columns=column)
        #
        # # 1 saved as Excel
        #
        # Excel_writer = pd.ExcelWriter(path='download.xlsx', engine='openpyxl')
        # df.to_Excel(excel_writer)
        # wb = Excel_writer.book
        #
        # response = HttpResponse(save_virtual_workbook(wb))
        # response["Content-Type"] = 'application/vnd.ms-Excel'
        # response['Content-Disposition'] = 'attachment; filename={}.xlsx'.format("for_test")
        # return response

        wb = Workbook()
        ws = wb.active
        ws.merge_cells('A1:B1')
        a1 = ws["A1"]
        ws["A1"] = "reason"
        ws.column_dimensions["A"].width = 100
        ALi = Alignment(horizontal='center', vertical='center')

        a1.alignment = ALi

        ws["A2"] = "request_id"
        ws.column_dimensions["A"].width = 50
        ws["B2"] = "rebate_reason"
        ws.column_dimensions["B"].width = 50

        for item in ws["A2:B2"][0]:
            item.font = Font(color='FF0000')
            item.alignment = ALi

        response = HttpResponse(save_virtual_workbook(wb))
        response["Content-Type"] = 'application/vnd.ms-Excel'
        response['Content-Disposition'] = 'attachment; filename={}.xlsx'.format("test_Excel")
        return response


urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', TestExcelView.as_view()),
]

wsgi.py

import os

from Django.core.wsgi import get_wsgi_application

#os.environ.setdefault('Django_SETTINGS_MODULE', 'test_Excel.settings')

application = get_wsgi_application()

test_Excel.ini

[uwsgi]
pythonpath=/home/bluev/work/bv_crm_bak/test_Excel
pythonpath=/home/bluev/work/bv_crm_bak/test_Excel
env=Django_SETTINGS_MODULE=test_Excel.settings
module=test_Excel.wsgi
master=True
pidfile=logs/test_Excel.pid
vacuum=True
max-requests=100000
enable-threads=true
processes = 4
threads=8
listen=64
daemonize=logs/test_Excel.log
log-slow=3000
python-autoreload=1
http=0.0.0.0:8876

次に、uwsgi --ini test_Excel.iniのようなプロジェクトをlxml installedとして開始し、localhost:8876/test/を要求すると、失敗したExcelファイルが取得されます。しかし、lxmlをアンインストールすると、結果は正しいです。

lxmlがDjango with uwsgiのExcel応答に影響を与える理由がわかりません

この状況でuwsgiを使用して正しいExcelファイル応答を取得するにはどうすればよいですか?

ありがとう。

pythonバージョン:Python 3.6.8

パッケージリスト:

asgiref==3.2.7
Django==3.0.6
et-xmlfile==1.0.1
jdcal==1.4.1
lxml==4.5.1
mysqlclient==1.4.6
numpy==1.18.4
openpyxl==3.0.3
pandas==1.0.3
python-dateutil==2.8.1
pytz==2020.1
six==1.14.0
sqlparse==0.3.1
uWSGI==2.0.18
xlrd==1.2.0
  • 異なる条件の詳細を更新
environ condition             Excel_file(if Excel file can be opened)

gunicorn + lxml  + Django                      yes

gunicorn + Django                              yes

Django runserver + lxml                        yes

Django runserver                               yes

uwsgi + lxml  + Django                         no

uwsgi + Django                                 yes

5
jia Jimmy

エラーの正確な原因についてはお答えできませんが、lxmlの存在が出力に影響している理由が質問である場合、openpyxlはインストール時にlxmlを使用するためです。ライブラリのxmlパッケージがインストールされていない場合。

Openpyxlから docs

インストールされている場合に使用される一般的なlxmlライブラリのサポートがあります。これは、大きなファイルを作成するときに特に役立ちます。

ここ は、openpyxlソースで、呼び出す関数を決定する前にlxmlがインストールされているかどうかを確認する場所です。

1
Delena Malan