通过python request库获取文件大小和文件类型(解决报错:KeyError: ‘content-length‘)


背景

把同一份文件分别存放到了两个oss(可以理解为两个存储商),通过两个oss 返回的下载 url 获取 两个文件的content-length 和 content-type信息,对比是否一致

遇到的问题:

1、当通过response header 获取content-length 的时候,千牛的url 没有返回 content-length

2、涉及到鉴权的私有文件url 获取不到真正的content-length

通过curl -i url 是可以返回同一个文件 存在两个url 的content-length 的,那怎么通过python解决以上两个问题呢(方法不一定最好,欢迎拍砖!)
在这里插入图片描述

一、解决获取不到content-length问题

方法:通过python 的requests.head(url,headers)指定header 里的Accept-Encoding参数,来获取文件流真实的content-length

原因:请求参数 headers里不指定文件流的Accept-Encoding,当服务器有对文件做了压缩后返回时,content-length就有可能获取不到

参考了博文:https://blog.csdn.net/chouhuan1877/article/details/100808814 有说明获取不到content-length的原因

实验对比:

def head_getcontent(file,srcDownloadUrl,distDownloadUrl):
    session = requests.session()
    headers = {
   
        "Accept-Encoding": "identity"
    }
    # 通过requests.head()填入不同的参数处理千牛的文件url
    src_only_url = requests.head(url=srcDownloadUrl)
    src_url_headers = requests.head(url=srcDownloadUrl, headers=headers)
    src_url_headers_stream = requests.head(url=srcDownloadUrl, stream=True, headers=headers)

    print("src_only_url headers= {}".format(src_only_url.headers))
    print("src_url_headers headers= {}".format(src_url_headers.headers))
    print("src_url_headers_stream headers= {}"
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的Python-Django网上投票系统代码,实现了连接数据、增删改查等功能: 1. 创建Django项目和应用 首先,使用命令行创建一个新的Django项目: ``` django-admin startproject voting_system ``` 然后,在项目目录下创建一个新的应用: ``` cd voting_system python manage.py startapp polls ``` 2. 定义模型 在应用的models.py文件中定义数据模型: ```python from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0) ``` 这里定义了两个模型,Question和Choice。Question模型包含一个问题文本和发布日期,Choice模型包含一个选项文本、所属问题和投票数。 3. 数据迁移 运行以下命令,创建表格: ``` python manage.py makemigrations python manage.py migrate ``` 4. 创建视图 在应用的views.py文件中定义视图函数,用于处理HTTP请求并返回响应: ```python from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse, HttpResponseRedirect from django.urls import reverse from .models import Question, Choice def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context) def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question}) def results(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/results.html', {'question': question}) def vote(request, question_id): question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'polls/detail.html', { 'question': question, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results', args=(question.id,))) ``` 这里定义了四个视图函数:index、detail、results和vote。index函数返回最新的5个问题列表,detail函数返回指定问题的详细信息,results函数返回指定问题的投票结果,vote函数处理投票请求并返回结果。 5. 创建模板 在应用的templates目录下创建HTML模板,用于渲染视图函数返回的数据。 6. 配置URL 在应用的urls.py文件中配置URL模式,将不同的URL请求映射到对应的视图函数。 ```python from django.urls import path from . import views app_name = 'polls' urlpatterns = [ path('', views.index, name='index'), path('<int:question_id>/', views.detail, name='detail'), path('<int:question_id>/results/', views.results, name='results'), path('<int:question_id>/vote/', views.vote, name='vote'), ] ``` 这里定义了四个URL模式,将空路径、问题详情、投票结果和投票请求映射到对应的视图函数。 7. 运行测试服务器 最后,运行以下命令启动测试服务器: ``` python manage.py runserver ``` 然后在浏览器中访问http://localhost:8000/polls/即可查看投票系统的首页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值