Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于通过API端点下载的文件,要选择Django模型中的哪个字段?_Python_Django - Fatal编程技术网

Python 对于通过API端点下载的文件,要选择Django模型中的哪个字段?

Python 对于通过API端点下载的文件,要选择Django模型中的哪个字段?,python,django,Python,Django,我正在使用Django 2.2 LTS 我有一个从端点下载文件的函数 def download_as_file(url: str, auth=(), file_path="", attempts=2): """Downloads a URL content into a file (with large file support by streaming) :param url: URL to download :par

我正在使用Django 2.2 LTS

我有一个从端点下载文件的函数

def download_as_file(url: str, auth=(), file_path="", attempts=2):
    """Downloads a URL content into a file (with large file support by streaming)

    :param url: URL to download
    :param auth: tuple containing credentials to access the url
    :param file_path: Local file name to contain the data downloaded
    :param attempts: Number of attempts
    :return: New file path. Empty string if the download failed
    """
    if not file_path:
        file_path = os.path.realpath(os.path.basename(url))
    logger.info(f"Downloading {url} content to {file_path}")
    url_sections = urlparse(url)
    if not url_sections.scheme:
        logger.debug("The given url is missing a scheme. Adding http scheme")
        url = f"https://{url}"
        logger.debug(f"New url: {url}")
    for attempt in range(1, attempts + 1):
        try:
            if attempt > 1:
                time.sleep(10)  # 10 seconds wait time between downloads
            with requests.get(url, auth=auth, stream=True) as response:
                response.raise_for_status()
                with open(file_path, "wb") as out_file:
                    for chunk in response.iter_content(chunk_size=1024 * 1024):  # 1MB chunks
                        out_file.write(chunk)
                logger.info("Download finished successfully")
                return (response, file_path)
        except Exception as ex:
            logger.error(f"Attempt #{attempt} failed with error: {ex}")
    return None
我还打算使用Django模型来存储与下载的文件相关联的元数据

class DownloadedFile(models.Model):
    # other fields but i skipped most of them here
    local_copy = models.FileField(upload_to="downloads/")
我知道有一个和一个

我的想法是在伪代码中执行以下操作:

# code that downloads the file and affix a timestamp as prefix for filename happens here.
response, downloaded_file_path_in_local_directory = download_as_file(url_of_file_to_download_from, auth_tuple)
# now to save the data into database
new_f = DownloadedFile()
new_f.field_1 = "abc"
new_f.local_copy = "I dont know what to put here because it depends whether i choose FileField or FilePathField"
new_f.save()
那么,我应该在分配
local\u copy
的部分做什么呢?我应该使用FileField还是FilePathField

更新1 好的,我刚找到这个

它建议,如果该文件将通过媒体向公众用户公开,则使用FileField,否则,如果它是现有文件,则使用FilePathField

这是一个公平的决定标准吗

更新2 让我说清楚。本例中的文件肯定是来自我无法控制的其他系统的文件(或我的Django应用程序将从中提取的文件)。这些文件不会由人工代理或用户上传


它们会被提供给我的Django应用程序的匿名公众用户吗?现在还不能确定。这是一个可能。也许别为了这个跟我唠叨。我已经尽了最大努力迫使客户回答,但现在,这可能是最好的选择。

这是一个相当明显的选择:

这就是Django文档所说的
FilePathField

一种字符域,其选择仅限于文件系统上某个目录中的文件名。具有一些特殊参数,其中第一个参数是必需的:

如果要在服务器上提供文件,请选择
FilePathField
。另一方面,如果要存储从用户处接收的文件,请选择
文件字段

更新:

至于存储文件,不管文件是来自其他用户还是机器:如果您使用的是Django
ModelForms
,您可以按如下方式处理您的文件(假设您使用的是Django表单,而不是
DRF
序列化程序):

发布
form.save()
时,该表单中的文件将保存到
媒体根目录中。您可以在
文件字段中定义存储的替代路径


考虑到这是一个单独的问题,您可以推迟以后下载该文件的决定。您不必在这里做出决定,也不必提前准备任何复杂的东西。

这是一个公平而明显的选择:

这就是Django文档所说的
FilePathField

一种字符域,其选择仅限于文件系统上某个目录中的文件名。具有一些特殊参数,其中第一个参数是必需的:

如果要在服务器上提供文件,请选择
FilePathField
。另一方面,如果要存储从用户处接收的文件,请选择
文件字段

更新:

至于存储文件,不管文件是来自其他用户还是机器:如果您使用的是Django
ModelForms
,您可以按如下方式处理您的文件(假设您使用的是Django表单,而不是
DRF
序列化程序):

发布
form.save()
时,该表单中的文件将保存到
媒体根目录中。您可以在
文件字段中定义存储的替代路径


考虑到这是一个单独的问题,您可以推迟以后下载该文件的决定。您不必在此处做出决定或预先准备任何复杂的内容。

好的,那么为了事先确认,我将存储从其他系统或机器接收的文件。我将“用户”理解为人工代理,并假设它是文件字段,如何分配它
new\u f.local\u copy=“我不知道在这里放什么”
@KimStacks更新了我的答案。如果我听起来很直率,我很抱歉。我感谢你为写答案所付出的努力。但我觉得我的问题要么读得不好,要么解释得不好。我最初的问题包括一个下载功能。其目的是强调我的Django应用程序将调用此函数,以将文件从另一个系统下载到我的Django应用程序文件目录中。既然如此,我为什么要使用上传表单呢?我随后的更新2突出显示,没有涉及人类代理。这都是我的Django应用程序主动从url下载的文件。再说一次,对不起,如果是bluntOk,那么为了事先确认,我存储了从其他系统或机器接收到的文件。我将“用户”理解为人工代理,并假设它是文件字段,如何分配它
new\u f.local\u copy=“我不知道在这里放什么”
@KimStacks更新了我的答案。如果我听起来很直率,我很抱歉。我感谢你为写答案所付出的努力。但我觉得我的问题要么读得不好,要么解释得不好。我最初的问题包括一个下载功能。其目的是强调我的Django应用程序将调用此函数,以将文件从另一个系统下载到我的Django应用程序文件目录中。既然如此,我为什么要使用上传表单呢?我随后的更新2突出显示,没有涉及人类代理。这都是我的Django应用程序主动从url下载的文件。再说一次,如果直截了当的话,我很抱歉
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm

# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file

def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            form.save()  # Explaination below
            return HttpResponseRedirect('/success/url/')
    else:
        form = UploadFileForm()
    return render(request, 'upload.html', {'form': form})