简体   繁体   English

Python,返回django rest框架中业务逻辑生成的html文件

[英]Python, return html file generated by business logic in django rest framework

I'm trying to create a Rest API that can receive data from a user, run some business logic on it and return as a response an HTML File that is generated based on the data passed in.我正在尝试创建一个 Rest API,它可以接收来自用户的数据,在其上运行一些业务逻辑,并返回一个基于传入数据生成的 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.

All I'm missing here is how to open the generated HTML file in the browser automatically.我在这里缺少的是如何在浏览器中自动打开生成的 HTML 文件。

The logic script contains two options, one is to save the HTML file and stop and one opens it automatically in the browser ( I thought of somehow utilizing it).逻辑脚本包含两个选项,一个是保存 HTML 文件并停止,一个是在浏览器中自动打开它(我想以某种方式利用它)。

My logic script我的逻辑脚本

# 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




If you can change your PlotOnMap() class's writing API to如果您可以将PlotOnMap()类的写入 API 更改为

  • accept a filename, you can use a tempfile.NamedTemporaryFile() that you can then read into a Django response;接受文件名,您可以使用tempfile.NamedTemporaryFile() ,然后您可以将其读入 Django 响应; or或者
  • accept an open file-like to write to, you can use an io.BytesIO to write to that you can then use as the content of a Django response.接受一个类似打开文件的写入,您可以使用io.BytesIO写入,然后您可以将其用作 Django 响应的content

This assumes the HTML file output is self-contained;这假设 HTML 文件输出是独立的; if it's not (eg it needs external stylesheets or scripts), you would probably need to make it so, or generate a ZIP file to contain everything.如果不是(例如,它需要外部样式表或脚本),您可能需要这样做,或者生成一个 ZIP 文件来包含所有内容。

Can you add below code to view and see if it works for you.您可以添加以下代码来查看并查看它是否适合您。

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

Here your function main(gdt1, gdt2, uav) should return a HTML file.这里你的函数 main(gdt1, gdt2, uav) 应该返回一个 HTML 文件。

Approach 2: Save html file to a specific path as filename.html and simply add below line to view.方法二:将html文件以filename.html的形式保存到指定路径,添加下面一行即可查看。

return render(request, 'path/filename.html')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM