Python, возврат html файл, сгенерированный бизнес-логи c в django остальные рамки - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать API отдыха, который может получать данные от пользователя, запускать на нем бизнес-логи c и возвращать в качестве ответа HTML Файл, который создается на основе переданных данных.

# models.py
from django.db import models
from django.utils import timezone
from django import forms

# Create your models here.

areas = [
    ('210', '210'),
    ('769', '769'),
    ('300', '300')
]


class LocationInfo(models.Model):
    latitude = models.FloatField(name="GDT1Latitude",
                                 unique=True, max_length=255, blank=False,
                                 help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                 default=1)
    longitude = models.FloatField(name="GDT1Longitude",
                                  unique=True, max_length=255, blank=False,
                                  help_text="Enter the location's Longitude, second when extracting from Google Maps.",
                                  default=1)
    gdt2_lat = models.FloatField(name="GDT2Latitude",
                                 unique=True, max_length=255, blank=False,
                                 help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                 default=1)
    gdt2_lon = models.FloatField(name="GDT2Longitude",
                                 unique=True, max_length=255, blank=False,
                                 help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                 default=1)
    uav_lat = models.FloatField(name="UavLatitude",
                                unique=True, max_length=255, blank=False,
                                help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                default=1)
    uav_lon = models.FloatField(name="UavLongitude",
                                unique=True, max_length=255, blank=False,
                                help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                default=1)

    uav_elevation = models.FloatField(name="UavElevation",
                                      max_length=100, default=1,
                                      blank=False,
                                      help_text="Enter the above ~Sea Level~ planned uav Elevation. "
                                      )

    area = models.CharField(
        max_length=8,
        choices=areas,
    )

    date_added = models.DateTimeField(default=timezone.now)

    class Meta:
        get_latest_by = 'date_added'
# serializers.py
from .models import LocationInfo
from rest_framework import serializers


class LocationInfoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = LocationInfo
        fields = (
            'id', 'GDT1Latitude', 'GDT1Longitude',
            'GDT2Longitude', 'GDT2Latitude',
            'UavLatitude', 'UavLongitude', 'UavElevation',
            'date_added'
        )
# views.py
class LocationInfoViewSet(ViewSet):
    queryset = LocationInfo.objects.filter(id=1).values()

    def retrieve(self, request, *args, **kwargs):

        data = self.queryset.reverse()[0]
        serialized_data = LocationInfoSerializer(data, many=False)
        points = list(serialized_data.data.values())

        gdt1 = (points[1], points[2])
        gdt2 = (points[3], points[4])
        uav = (points[5], points[6], points[-2])

        # My business logic which returns an HTML File based on the data passed in.
        data = main(gdt1, gdt2, uav)
     # I got stuck here.

Все, чего мне здесь не хватает, - это как автоматически открыть сгенерированный файл HTML в браузере.

Сценарий logi c содержит две опции: одна для сохранения файла HTML и остановки, а другая - для автоматического открытия в браузере (я подумал о том, чтобы каким-то образом его использовать).

Мои логи c скрипт

# main.py

import numpy as np
from Project_Level.angle_condition import MeetAngleCond
from Project_Level.plot_folium import PlotOnMap
from Project_Level.utils import convert_to_xy
from .dataframes import GetDataToGeoPandas
from .positions_data_collecting import PositionsData


def main(gdt1, gdt2, uav):
    # Get the complete latitude, longitude, lists.
    positions_data = PositionsData(gdt1=gdt1,
                                   gdt2=gdt2,
                                   uav=uav)
    full_lat_lon_list, lat_list, lon_list = positions_data.calculate_list_lens()

    # Get cartesian coordinates for every point.
    gdt1_xy = np.asarray(convert_to_xy(gdt1))
    gdt2_xy = np.asarray(convert_to_xy(gdt2))

    # Get the angle for every point in f_lat_lon_list
    angles_list = MeetAngleCond()
    plot_angles_list = angles_list.create_angles_list(lat_lon_list=full_lat_lon_list,
                                                      arrayed_gdt1=gdt1_xy,
                                                      arrayed_gdt2=gdt2_xy,
                                                      uav_elev=uav[-1])

    get_final_lists = GetDataToGeoPandas()
    lat_lon_a, lat_lon_b, optimal = get_final_lists.create_gpd_and_final_lists(angles_list=plot_angles_list,
                                                                               lat_list=lat_list,
                                                                               lon_list=lon_list)
    plot = PlotOnMap(lat_lon_a=lat_lon_a,
                     lat_lon_b=lat_lon_b,
                     optimal=optimal)
    plot.create_map(mid_point=gdt1, zoom=13)
    plot.plot_gdt_and_triangulation(gdt1=gdt1, gdt2=gdt2, uav=uav)
    plot.plugins()
    # option 1: save the html file in the directory.
    map_file = plot.return_html_link()

    # option 2: open it automatically in the browesr.
    # map_file = plot.auto_open(html_map_file='index.html')

    return map_file




Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Можете ли вы добавить ниже код для просмотра и посмотреть, работает ли он для вас.

return render(request, main(gdt1, gdt2, uav))

Здесь ваша функция main (gdt1, gdt2, uav) должна вернуть файл HTML.

Подход 2: Сохранить файл html в указанном пути c как имя файла. html и просто добавьте строку ниже для просмотра.

return render(request, 'path/filename.html')
1 голос
/ 25 февраля 2020

Если вы можете изменить API записи вашего класса PlotOnMap() на

  • принять имя файла, вы можете использовать tempfile.NamedTemporaryFile(), который затем можно прочитать в ответ Django; или
  • принять открытый файл-подобный для записи, вы можете использовать io.BytesIO для записи, который затем можно использовать в качестве content ответа Django.

Предполагается, что вывод файла HTML является автономным; если это не так (например, для него нужны внешние таблицы стилей или скрипты), вам, вероятно, потребуется сделать это или сгенерировать ZIP-файл, содержащий все.

...