Запустите Python скрипт в Django шаблоне через кнопку - PullRequest
0 голосов
/ 16 апреля 2020

У меня очень маленький проект в Django, где я получаю fx_rates через скрипт Python (подробности ниже). Они используются для конвертации сумм в разных валютах в фунты стерлингов. Я хотел бы знать, как у меня может быть просто кнопка на веб-сайте, которая позволяет обновить sh этот запрос вместо необходимости запускать его вручную в IDE. Могу ли я создать представление для этого? Как бы я показал это в шаблоне? Спасибо

fx_rates.py

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','fx_rates_project.settings')

import django
django.setup()


from fx_rates_app.models import fx_table

import pandas_datareader.data as web
from datetime import datetime
os.environ["ALPHAVANTAGE_API_KEY"] = '#########'
fx_gbp_to_eur = web.DataReader("GBP/EUR","av-forex")
eur = float(fx_gbp_to_eur[4:5].values[0][0])


fx_gbp_to_aud = web.DataReader("GBP/AUD","av-forex")
aud = float(fx_gbp_to_aud[4:5].values[0][0])


fx_gbp_to_usd = web.DataReader("GBP/USD","av-forex")
usd = float(fx_gbp_to_usd[4:5].values[0][0])

from datetime import datetime

now = datetime.now()

dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

webpg1 = fx_table.objects.get_or_create(eur_to_gbp=eur,aud_to_gbp=aud,usd_to_gbp=usd,date_time=dt_string)[0]

В шаблон, который я включил:

<form method="post">
    {% csrf_token %}
    <button type="submit" name="run_script">Refresh</button>
</form>

Однако я не думаю, что лучший способ сделать это - Скопируйте все сценарии в представлениях с запросом.POST. Есть ли другой способ оставить скрипт в другом файле и просто создать представление для его запуска (например, если request.method == 'POST' run fx_rates.py)?

1 Ответ

0 голосов
/ 16 апреля 2020

Это определенно можно сделать, создав функцию update_fx, чтобы обернуть ваш скрипт, а затем вызвать эту функцию в вашем представлении.

Теперь для сложной части.

Вам нужна значения для их рендеринга или просто для их обновления?

Рендеринг будет легким, просто верните их из своей функции, и вы сможете использовать их в своем шаблоне.

Это включает в себя ожидание время, чтобы получить эти значения. Когда ваше представление будет выполнено, вам придется подождать, пока функция извлечет значения.

Альтернативой является «запуск» второго задания, которое обновляет значения из вашего представления. Этот шаблон называется очередью задач, и есть много решений, которые вы уже можете использовать, в зависимости от того, насколько сложными должны быть вещи (что произойдет, если в работе возникла ошибка? Сколько раз мы должны повторить? ...).

К сожалению, это также приводит к тому, что теперь вы запускаете второй сценарий python где-то, который прослушивает новые задачи и выполняет их.

Как всегда, ваш выбор основан на компромиссах, лично, если у сервера есть хорошие * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * 10 * * 10 *) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '* *' * * '* *' * * '* *' * '*' * '*' * '*' * '*' * '' * '' * '*' * '

# update.py

from fx_rates_app.models import fx_table
import pandas_datareader.data as web
from django.conf import settings
from datetime import datetime
import os

def get_price():    
    os.environ["ALPHAVANTAGE_API_KEY"] = '#########'
    fx_gbp_to_eur = web.DataReader("GBP/EUR","av-forex") # here we are reading stuff from the network I guess
    eur = float(fx_gbp_to_eur[4:5].values[0][0])

    fx_gbp_to_aud = web.DataReader("GBP/AUD","av-forex")
    aud = float(fx_gbp_to_aud[4:5].values[0][0])

    fx_gbp_to_usd = web.DataReader("GBP/USD","av-forex")
    usd = float(fx_gbp_to_usd[4:5].values[0][0])

    now = datetime.now()

    dt_string = now.strftime("%d/%m/%Y %H:%M:%S")

    # here you have two choices,
    # either you return the raw values
    # or you put them into a model
    return {
        'timestamp': dt_string,
        'value': 1,
        'currency': 'gbp',
        'eur': eur,
        'aud': aud,
        'us': us,
    }

    webpg1 = fx_table.objects.get_or_create(eur_to_gbp=eur,aud_to_gbp=aud,usd_to_gbp=usd,date_time=dt_string)[0]
    return webpg1

# views.py
from django.http import HttpResponse
from update import get_price

def refresh_from_values(request):
    data = get_price() # here we don't have a model, just data
    webpg1 = fx_table.objects.get_or_create(
        eur_to_gbp=data['eur'],
        aud_to_gbp=data['aud'],
        usd_to_gbp=data['usd'],
        date_time=data['timestamp'],
    )[0]
    # here your render the model using the template

def refresh_from_model(request):
    fx = get_price() # here we get back the model instead
    # you can render again the model as you can refresh the page
*)

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

...