0

我想在我的 Django 网站上访问和打印由ERDDAP服务器提供的元数据(属性和值),该服务器是各种 OPeNDAP。

所以我准备了一个简单的示例函数,调用该函数get_conventions来访问这个托管数据和元数据的公共服务器上的元数据字段。首先,我安装所需的软件包:

$ pip install pandas erddapy

接着,

import pandas as pd
from erddapy import ERDDAP

def get_conventions(dataset_id):
    e = ERDDAP(server='https://gliders.ioos.us/erddap/', protocol='tabledap', response='csv')
    url = e.get_info_url(dataset_id, response='csv')
    df = pd.read_csv(url)

    # this replace spaces with underscores in column names
    df.columns = [col_name.replace(' ', '_') for col_name in df.columns]

    conventions = df[df.Attribute_Name == 'Conventions'].Value
    return conventions

使用 Python 解释器,可以使用此示例数据集 id 作为参数 (amelia-20180501T0000) 调用这样的函数,该参数位于服务器上;输出如下:

>>> get_conventions('amelia-20180501T0000')
6    Unidata Dataset Discovery v1.0, COARDS, CF-1.6
Name: Value, dtype: object
>>>

我希望我的网站在网页上打印上述功能的输出。

我可以在页面中打印参数字符串(model.py、views.py 和相关的 html 模板 - 类似于Django 教程),但我不确定如何将参数引用到函数(并期望返回)或如何/在何处将功能集成到 Django 结构中。

参数存储在本地数据库中,可以使用模型/视图/模板引用

但是我不确定如何在Django中集成涉及该功能的部分?

4

2 回答 2

1

该方法将取决于该函数是跨应用程序、在单个应用程序中使用还是与 Django 模型相关联。

对于跨应用程序功能,我通常为每组功能创建一个名为 core 或 utils 的单独应用程序,其中包含 python 文件。为了您的示例,我们称它为erddapy.py。在views.py您的视图中,只需from utils.erddapy import get_conventions在您的视图中调用它并传入参数。然后将结果作为上下文返回给模板。

如果它仅在单个应用程序中使用但未绑定到模型,您还可以在该应用程序中创建一个 utils.py 文件,然后在from .utils import get_conventionsviews.py的视图中调用它。

如果您已经为数据集定义了模型并将数据集 id 存储在那里,它可能更适合模型方法。这样,您可以在视图中使用查询集 API 来获取实例,然后简单地调用instance.get_conventions(). 这种方法不需要参数,因为您可以简单地从self.dataset_id方法逻辑中获取数据集 id。

# view
id = self.kwargs.get('id')
if id:
    instance = get_object_or_404(MyModel, id=id)
    data = instance.get_conventions()
# return the data as context in an http response

# model method
class MyModel(models.Model):
    # model fields
    
    def get_conventions(self):
        dataset_id = self.dataset_id
        # get the data
    

我想潜在的问题是您如何存储或获取数据集 ID?如果它在一个单独的本地数据库中,您可能需要查询它以获取我将在单独的函数中执行的数据集 ID。然后要么将它作为参数传递给函数,要么将它作为模型实例存储在你的 Django 数据库中,并使用上面解释的方法方法。

于 2022-02-11T00:06:58.767 回答
0

在阅读了 D. Patel 的这篇文章后,我能够完成这项工作。

它涉及将以下内容添加到名为的文件中,该文件services.py被放置在名为 的应用程序子文件夹中templatetags。这是get_conventions自定义函数所在的位置:

from django import template
...

register = template.Library()


@register.filter
def get_conventions(dataset_id):
...
    return conventions

在模板中,我必须加载services文件并将以下内容添加到 html 模板中:

{% load services %}
{% block content %}
    <p><strong>Conventions:</strong> {{ station.dataset_id | get_conventions }}</p>
...
{% endblock %}

station.dataset_id|是与返回值配对的 get_conventions 函数的参数

它按预期工作。这很简单。

于 2022-02-12T18:47:49.067 回答