簡體   English   中英

apache 中的 Pygal 導入失敗

[英]Pygal import failure in apache

我正在嘗試運行一個顯示 pygal 圖的簡單 Flask web 應用程序。 當我使用 python 開發服務器運行它時,應用程序運行良好。 但是,當我嘗試在 apache2 中運行它時,出現以下錯誤:

[Thu Dec 10 19:55:22.745469 2020] [wsgi:error] [pid 17741] [client ::1:34366] mod_wsgi (pid=17741): Failed to exec Python script file '/var/www/FlaskApp/FlaskApp.wsgi'.
[Thu Dec 10 19:55:22.745521 2020] [wsgi:error] [pid 17741] [client ::1:34366] mod_wsgi (pid=17741): Exception occurred processing WSGI script '/var/www/FlaskApp/FlaskApp.wsgi'.
[Thu Dec 10 19:55:22.745553 2020] [wsgi:error] [pid 17741] [client ::1:34366] Traceback (most recent call last):
[Thu Dec 10 19:55:22.745586 2020] [wsgi:error] [pid 17741] [client ::1:34366]   File "/var/www/FlaskApp/FlaskApp.wsgi", line 8, in <module>
[Thu Dec 10 19:55:22.745650 2020] [wsgi:error] [pid 17741] [client ::1:34366]     from FlaskApp import app as application
[Thu Dec 10 19:55:22.745665 2020] [wsgi:error] [pid 17741] [client ::1:34366]   File "/var/www/FlaskApp/FlaskApp/__init__.py", line 2, in <module>
[Thu Dec 10 19:55:22.745707 2020] [wsgi:error] [pid 17741] [client ::1:34366]     import pygal
[Thu Dec 10 19:55:22.745723 2020] [wsgi:error] [pid 17741] [client ::1:34366]   File "/var/www/FlaskApp/FlaskApp/venv/lib/python3.8/site-packages/pygal/__init__.py", line 28, in <module>
[Thu Dec 10 19:55:22.745786 2020] [wsgi:error] [pid 17741] [client ::1:34366]     import pkg_resources
[Thu Dec 10 19:55:22.745838 2020] [wsgi:error] [pid 17741] [client ::1:34366]   File "/var/www/FlaskApp/FlaskApp/venv/lib/python3.8/site-packages/pkg_resources/__init__.py", line 1365
[Thu Dec 10 19:55:22.745850 2020] [wsgi:error] [pid 17741] [client ::1:34366]     raise SyntaxError(e) from e
[Thu Dec 10 19:55:22.745857 2020] [wsgi:error] [pid 17741] [client ::1:34366]                             ^
[Thu Dec 10 19:55:22.745864 2020] [wsgi:error] [pid 17741] [client ::1:34366] SyntaxError: invalid syntax

這是我正在運行的代碼

# -*- coding: utf-8 -*-
import pygal
from flask import Flask, Response


app = Flask(__name__)


@app.route('/')
def index():
    """ render svg on html """
    return """
<html>
    <body>
        <h1>hello pygal</h1>
        <figure>
        <embed type="image/svg+xml" src="/graph/" />
        </figure>
    </body>
</html>'
"""


@app.route('/graph/')
def graph():
    """ render svg graph """
    bar_chart = pygal.Bar()
    bar_chart.add('Fibonacci', [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
    return Response(response=bar_chart.render(), content_type='image/svg+xml')


if __name__ == '__main__':
    app.run()

(請注意,此代碼只是從 github 復制的示例)

這是我的 apache 站點配置:

<VirtualHost *:443>
    ServerName flaskapp.localhost
    ServerAdmin me@email.com
    WSGIScriptAlias / /var/www/FlaskApp/FlaskApp.wsgi
    
    <Directory /var/www/FlaskApp/FlaskApp/>
        Order allow,deny
        Allow from all
    </Directory>
    Alias /static /var/www/FlaskApp/FlaskApp/static
    <Directory /var/www/FlaskApp/FlaskApp/static/>
        Order allow,deny
        Allow from all
    </Directory>

    DocumentRoot /var/www/FlaskApp

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

    ErrorLog ${APACHE_LOG_DIR}/FlaskApp-error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/FlaskApp-access.log combined

    AddDefaultCharset utf-8

</VirtualHost>

這是我的 wsgi 文件:

python_home = '/var/www/FlaskApp/FlaskApp/venv'

activate_this = python_home + '/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")
sys.path.insert(0,"/var/www/FlaskApp/FlaskApp/venv/lib/python3.8/site-packages/")

from FlaskApp import app as application
application.secret_key = 'secret key stuff'

以下是有關我的環境的一些詳細信息:
Ubuntu 20.04.1 LTS
Apache/2.4.41 (Ubuntu)
Python 3.8.5(安裝在虛擬環境中)

任何想法將不勝感激!

python 解釋器似乎被編譯到 mod_wsgi.so 文件中。 Apache 指向了一個包含 python2 的舊版本。 為了解決它,我做了以下事情:

  1. 通過執行sudo apt-get remove libapache2-mod-wsgi刪除了舊版本的 mod_wsgi
  2. 修改 /etc/apache2/mods-available/mod_wsgi.load 以指向我的虛擬環境中的庫(.so)文件。 mod_wsgi 的內容如下所示:
LoadModule wsgi_module /var/www/FlaskApp/FlaskApp/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so

我懷疑在這里修改它會將所有 Apache 虛擬主機指向這個 python 虛擬環境,這並不理想。 如果每個 Apache 虛擬主機都指向自己的 python 環境會更好。

  1. 修改了我的 wsgi 文件以使用新版本的 python。 以下是內容:
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")
sys.path.insert(0,"/var/www/FlaskApp/FlaskApp/venv/lib/python3.8/site-packages/")

from FlaskApp import app as application
application.secret_key = 'secret key stuff'
  1. 將我的__init__.py文件中的本地導入更改為以點(。)

在進行了這些更改之后,該站點現在可以按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM