如何将用户输入从AngularJS表单传递给python后端?

时间:2018-06-06 12:49:11

标签: python angularjs backend web-frontend

如何将用户输入从AngularJS表单传递给python后端?

我正在开发一个Web应用程序,后端是用Python编写的,而前端是用AngularJS编写的。我使用过Python和&之前的JavaScript,但在我需要两种语言进行交互的情况下却没有做很多。

在应用程序的其中一个页面上,有一个表单,用户可以使用该表单将数据从数据库导出到CSV文件 - 用户输入一些详细信息,指定他们想要使用的数据导出表格,然后按“导出”键。按钮生成&下载包含该信息的CSV文件。

数据库中的某些信息具有与之关联的时间值,我想实现在不同时区导出数据的功能。

settings.py文件中,在名为Production的类中,有一个TIME_ZONE变量设置为UTC,所以所有的时间相关' Python后端记录在数据库中的数据将保存为UTC值。

数据库中记录的信息包括世界各地的数据,但目前看来所有这些信息都是参考UTC时间记录的,所以如果例如中国有人要输出数据在中国的网站,导出的信息仍将全部参考UTC时间。

我在“导出”表单中添加了一个字段,允许用户在导出数据时选择不同的时区,但由于数据全部以UTC格式记录,因此在导出时,它仍会显示时间字段的UTC值。

当用户点击“导出”时生成CSV文件的Python函数。是:

# This class provides the basis to implement the CSV output format
class CSVOutput(object):
# When the user asks for a download this file extension will be used
EXTENSION = 'csv'

# The internet media type for CSV files is specified by RFC 4180
HEADERS = [('Content-Type', 'text/csv; charset=UTF-8')]

# Specify a custom lexer for use with pygments (used for highlighting in
# the browsable API)
LEXER = CSVLexer

# This method is called to determine the headings given the object
def get_headings(self, obj):
    raise NotImplementedError

# This method is called to prepare a row given the record
def format_row(self, record):
    raise NotImplementedError

# This method takes a response and converts it to CSV format
def dumps(self, obj, **hints):
    # Watch out for the user asking to convert a listing
    if isinstance(obj, list):
        raise ValueError('CSV output is only supported for instances')

    # The response should usually be a ResponseWrapper instance
    if not hasattr(obj, 'extra'):
        raise ValueError('Object is missing the "extra" attribute')

    # All log query responses should have a key for the records
    if 'records' not in obj.extra:
        raise ValueError('Response is missing the "records" key')

    # In order to use the CSV writer we need a file-like object
    data = StringIO()

    # Create a CSV writer using the default dialect
    writer = get_writer(data)

    # The first line of the CSV always contains the headings
    writer.writerow(self.get_headings(obj))

    # All the other rows contain data (which we format first)
    writer.writerows(map(self.format_row, obj.extra['records']))

    # Pass back the headers, converted data and file extension
    return self.HEADERS, data.getvalue(), self.EXTENSION

表单上的“导出”按钮的HTML是:

<div class="row">
        <div class="col-sm-4"></div>
        <div class="col-sm-4">
            <button class="btn btn-sm btn-block btn-brand" ng-hide="!btnDisabled" ng-click="setDownloadUrl(true)">
                <i class="ti-export"></i>
                <span data-i18n="Export"></span>
            </button>
            <a class="btn btn-sm btn-block btn-brand" role="button" target="_blank" href="{{downloadURL}}" ng-hide="btnDisabled">
                <i class="ti-export"></i>
                <span data-i18n="Export"></span>
            </a>
        </div>
    </div>

所以,我想知道的是,基于&#39;时区的价值&#39;在表单上的字段,我如何去添加/减去数据库中记录的时间值,以便导出文件中的时间值是他们导出的地方的本地值?

例如,如果有人要在英国的某个地方导出信息 - 我只需要在记录的UTC时间内加1,以便将其导出为BST值。如果他们要在北京的某个地方输出信息,我会在记录的UTC时间内加上8小时,以便按照北京当地的时间值输出。

修改

此问题与Getting the client's timezone in JavaScript不同,因为我不一定希望获得客户端本地的时区。我希望允许用户自行选择时区,可能是也可能不是本地时区。

通过设置此应用程序的Python后端的方式,所有时间值当前都以UTC格式记录,无论记录数据的站点的位置如何。

这意味着,目前,当用户想要导出数据时,无论该信息是针对欧洲,美国还是东南亚等,他们导出的任何时间值都将以UTC格式导出。

我想允许用户导出任何给定网站的信息,无论他们当前的位置如何,并且参考其当地时间显示该网站的信息 - 仅获取客户的本地时区当客户端位于要导出数据的站点时解决问题。

0 个答案:

没有答案