Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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 使用Django通过谷歌云签名URL发送元标记_Python_Django_Google Cloud Platform_Google Cloud Storage - Fatal编程技术网

Python 使用Django通过谷歌云签名URL发送元标记

Python 使用Django通过谷歌云签名URL发送元标记,python,django,google-cloud-platform,google-cloud-storage,Python,Django,Google Cloud Platform,Google Cloud Storage,我正在使用已签名的url在我的google存储上获取或发布/放置视频文件。我的模块在运行,运行得很好。 我想在我的请求中添加一些元数据标签,以便更有效地管理与地面军事系统相关的费用。但是由于我添加了这些头,请求返回cors策略错误失败:(我缩短了上面块中的签名以使其更具可读性) 详细信息如下: <Error> <Code>MalformedSecurityHeader</Code> <Message>Your request

我正在使用已签名的url在我的google存储上获取或发布/放置视频文件。我的模块在运行,运行得很好。 我想在我的请求中添加一些元数据标签,以便更有效地管理与地面军事系统相关的费用。但是由于我添加了这些头,请求返回cors策略错误失败:(我缩短了上面块中的签名以使其更具可读性)

详细信息如下:

   <Error>
    <Code>MalformedSecurityHeader</Code>
    <Message>Your request has a malformed header.</Message>
    <ParameterName>x-goog-meta-account</ParameterName>
    <Details>Header was included in signedheaders, but not in the request.</Details>
   </Error>
cors配置为允许我的桶上几乎所有东西:

[{"maxAgeSeconds": 3600, "method": ["*"], "origin": ["*"], "responseHeader": ["*"]}]
这里是Python/Django函数

def _get_signed_url(self, http_method="GET"):
        """' create a signed url with google storage
        create a 'GET' request by default,
        add method='w' or 'put' to create a 'PUT' request
        get_signed_url('w')->PUT / get_signed_url()->GET
        """
        if http_method.lower() in ["w", "put", "post"]:
            http_method = "PUT"
        else:
            http_method = "GET"

        signed_url = generate_signed_url(
            settings.GS_BUCKET_NAME,
            self.file.name,
            subresource=None,
            expiration=3600,
            http_method=http_method,
            query_parameters=None,
            headers={'x-goog-meta-language':'french','x-goog-meta-account':'david',},
        )

        return signed_url
正如我在上面写的,方法get_signed_url()是从 如果我替换
headers={'x-goog-meta-language':'french','x-goog-meta-account':'david',},
通过
hearders={}
headers=None
(就像以前一样,它工作正常

最后,当我单击签名url提供的链接时,我收到一条错误消息:

签名的url以及blob上传或下载在没有标题的情况下可以正常工作好几个月,但我不明白为什么服务器会响应标题元标记的格式不正确。。。 我将感谢任何帮助
谢谢!

正如@Sideshowbarker在他的评论中所说,问题来自客户。 签名的url用于通过ajax将文件发送到存储器,但没有向@Sideshowbarker在其评论中建议的自定义头添加,问题来自客户端。 签名的url用于通过ajax将文件发送到存储器,但没有向ajax添加自定义头。 通过在ajax中指定头,带有自定义元数据的签名url的PUT请求可以很好地工作

   function ajaxSendToStorage(uuid, url) {
  // Sending ONE file to storage
  var file = getFileById(uuid);
  $.ajax({
    method: "PUT",
    contentType: file.type,
    processData: false,
    dataType: "xml",
    crossDomain: true,
    data: file,
    url: url,
    headers: {"x-goog-meta-account":"david","x-goog-meta-language": "fr"},
    success: function() {},
    complete: function() {},
  });
}

正如@Sideshowbarker在评论中指出的,问题来自客户。 签名的url用于通过ajax将文件发送到存储器,但没有向@Sideshowbarker在其评论中建议的自定义头添加,问题来自客户端。 签名的url用于通过ajax将文件发送到存储器,但没有向ajax添加自定义头。 通过在ajax中指定头,带有自定义元数据的签名url的PUT请求可以很好地工作

   function ajaxSendToStorage(uuid, url) {
  // Sending ONE file to storage
  var file = getFileById(uuid);
  $.ajax({
    method: "PUT",
    contentType: file.type,
    processData: false,
    dataType: "xml",
    crossDomain: true,
    data: file,
    url: url,
    headers: {"x-goog-meta-account":"david","x-goog-meta-language": "fr"},
    success: function() {},
    complete: function() {},
  });
}

当我对来自GCP的预签名URL执行GET请求时,我收到了相同的错误消息。添加内容类型:“application/octet stream”为我解决了这个问题

ajaxCall_getFile = $.ajax({    
xhr: function() {
var xhr = new window.XMLHttpRequest();
return xhr;
},
type: 'GET',
url: <PRE-SIGNED URL>,
contentType: "application/octet-stream",
processData: false,
success: function(file_data){
  alert("file downloaded");
},
error: function(err) {
  alert('Download failed, please try again.');
}
});
ajaxCall\u getFile=$.ajax({
xhr:function(){
var xhr=new window.XMLHttpRequest();
返回xhr;
},
键入:“GET”,
网址:,
contentType:“应用程序/八位字节流”,
processData:false,
成功:函数(文件\数据){
警报(“文件下载”);
},
错误:函数(err){
警报('下载失败,请重试');
}
});

当我对来自GCP的预签名URL执行GET请求时,收到了相同的错误消息。添加内容类型:“应用程序/八位字节流”为我解决了这个问题

ajaxCall_getFile = $.ajax({    
xhr: function() {
var xhr = new window.XMLHttpRequest();
return xhr;
},
type: 'GET',
url: <PRE-SIGNED URL>,
contentType: "application/octet-stream",
processData: false,
success: function(file_data){
  alert("file downloaded");
},
error: function(err) {
  alert('Download failed, please try again.');
}
});
ajaxCall\u getFile=$.ajax({
xhr:function(){
var xhr=new window.XMLHttpRequest();
返回xhr;
},
键入:“GET”,
网址:,
contentType:“应用程序/八位字节流”,
processData:false,
成功:函数(文件\数据){
警报(“文件下载”);
},
错误:函数(err){
警报('下载失败,请重试');
}
});

如果您修复了格式错误的SecurityHeader错误的原因,您可能会发现现有的CORS配置已按预期工作。当响应状态不是200 OK,而是出现一些错误时,这是正常的,并且预期响应不会有Access Control Allow Origin响应头。是的,我不怀疑t cors。当我不发送额外的头并且所有内容都经过cors授权时,签名的url就会工作。我不明白的是,为什么我的元数据格式不正确,为什么头={'x-goog-meta-language':'fr'}不正确…我对谷歌云的东西没有任何领域知识,但我注意到问题中引用的错误是,“头包含在signedheaders中,但不包含在请求中。”这似乎表明问题不在于报头的值存在某种形式的错误,而在于请求报头完全缺失。因此,您可能希望更新该问题,以显示发出请求的前端JavaScript代码部分的片段。该代码是否确保包含正确的报头在请求中?我发现了,这似乎和你遇到的问题差不多。删除的答案是,“此错误意味着您在创建签名时包含了HTTP标头。这意味着客户端在上载时也必须包含此标头。请在签名前删除标头,或者在发出HTTP请求时修改客户端软件以包含标头。”我知道问题来自HTTP请求。但该URL是由GCP通过“已签名URL v4脚本”提供的“generate_signed_URL()”方法构建的。我只是通过“print”的django模板将给定URL发送给客户端带有签名url的链接。当用户单击该url提供的链接时,客户端将发送一个GET请求。由于无法修改链接本身中的请求,如何在请求中插入标头?如果修复格式错误的SecurityHeader错误的原因,您可能会发现现有CORS配置已被禁用rking如预期。当响应状态不是200 OK但出现一些错误时,这是正常的,并且预期响应不会有Access Control Allow Origin响应标头。是的,我不怀疑cors。当我不发送其他标头并且所有内容都通过cors授权时,签名url工作。我不理解的是为什么我的元数据格式不正确,为什么headers={'x-goog-meta-language':'fr'}不正确……我对谷歌云的内容没有任何领域知识,但我注意到问题中引用的错误是,“Header包含在signedheaders中,但不包含在请求中。”这似乎表明