отображение динамической веб-страницы из скрипта Python с использованием http.server - PullRequest
0 голосов
/ 02 июля 2018

Я работаю локально со скриптом Python на моем Mac, используя python3 -m http.server --cgi

Мой скрипт работает. Я создаю графику и динамическую веб-страницу и открываю эту страницу в новой вкладке. Что мне не нравится, так это то, что он оставляет пустое окно, где находится адрес скрипта. Поэтому, когда я запускаю веб-страницу с формой и нажимаю «Отправить». Я получаю пустую страницу и новую страницу. Я просто хотел бы перейти на новую страницу. Я новичок в Python, поэтому я не совсем уверен, что я делаю не так. Вот мой сценарий:

    #!/usr/bin/env python3

    import pyromat as pm
    import matplotlib.pyplot as plt
    import numpy as np
    import webbrowser

    # Create a temperature array in steps of 10K
    T = np.arange(300,2000,10)
    # Get the Oxygen object
    O2 = pm.get('ig.O2')

    f = plt.figure(1)   # Call up figure 1
    f.clf()         # clear it (if it already exists)
    ax = f.add_subplot(111) # Create an axes object on the figure
    ax.plot(T, O2.cp(T))    # Add a curve to that axes
    ax.set_xlabel('Temperature (K)')
    ax.set_ylabel('Specific Heat (kJ/kg/K)')
    f.savefig('cp.png') # Make a file

    f = open('test.html','w')

    message = """<html>
    <head></head>
    <body><p>Graph Test</p><img src="cp.png"></body>
    </html>"""

    f.write(message)
    f.close()

    filename = 'file:///Users/pzb4/Documents/Environments/test.html'
    webbrowser.open(filename,new=0,autoraise=True)

Идея состоит в том, чтобы создать форму, в которой я могу изменить входные данные для графика. В идеале это просто переписало бы страницу формы, чтобы ученик мог продолжать изменять данные и видеть, как это влияет на график.

1 Ответ

0 голосов
/ 03 июля 2018

Поскольку вы запускаете его как скрипт CGI, вы можете записать в стандартный вывод:

#!/usr/bin/env python3

import pyromat as pm
import matplotlib.pyplot as plt
import numpy as np
import webbrowser
from io import BytesIO
import base64

# Create a temperature array in steps of 10K
T = np.arange(300,2000,10)
# Get the Oxygen object
O2 = pm.get('ig.O2')

f = plt.figure(1)   # Call up figure 1
f.clf()         # clear it (if it already exists)
ax = f.add_subplot(111) # Create an axes object on the figure
ax.plot(T, O2.cp(T))    # Add a curve to that axes
ax.set_xlabel('Temperature (K)')
ax.set_ylabel('Specific Heat (kJ/kg/K)')

image_bytes = BytesIO()

f.savefig(image_bytes, format="png") # write bytes to in-memory object
image_bytes.seek(0) # go to beginning of bytes

# print HTTP headers
print("Content-Type: text/html; charset=utf-8")
print()

# encode as Base64
src = base64.b64encode(image_bytes.read())

message = """<html lang="en"><head><title>Result</title></head>
<body><p>Graph Test</p><img src="data:image/png;base64,{}"></body></html>"""

# print HTML with embedded image
print(message.format(src))

Это позволяет избежать записи либо HTML, либо изображения на диск. Вместо этого он записывает HTML-код в стандартный вывод (который должен отображаться в браузере) и встраивает изображение непосредственно в источник HTML в виде данных Base64.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...