Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.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 如果内容类型是image-like-do-something,则elif是text/html,然后执行其他操作。如何做到这一点?_Python_Django - Fatal编程技术网

Python 如果内容类型是image-like-do-something,则elif是text/html,然后执行其他操作。如何做到这一点?

Python 如果内容类型是image-like-do-something,则elif是text/html,然后执行其他操作。如何做到这一点?,python,django,Python,Django,首先,我为这个标题道歉。我不知道怎么解释,所以我写了这样的标题 我想检查内容类型,如果是图像/运行这些代码 from PIL import Image import io, uuid, requests class LinkCreateView(CreateView): model = Link form_class = LinkForm def form_valid(self, form): headers = {'content-type': 'i

首先,我为这个标题道歉。我不知道怎么解释,所以我写了这样的标题

我想检查内容类型,如果是图像/运行这些代码

from PIL import Image
import io, uuid, requests

class LinkCreateView(CreateView):
    model = Link
    form_class = LinkForm

    def form_valid(self, form):
        headers = {'content-type': 'image/'}
        r = requests.get(form.instance.url, headers=headers)
        i = Image.open(io.BytesIO(r.content)).convert('RGB')
        image_io = io.BytesIO()
        try:
            crop_image = ImageOps.fit(i, method=Image.ANTIALIAS, size=(65, 65), bleed=0.5, centering=(0.5, 0.5))
            hash = str(uuid.uuid1())
            name = "{}.jpeg".format(hash)
            crop_image.save(image_io, format="jpeg")
            form.instance.img.save(name, ContentFile(image_io.getvalue()))
        finally:
            image_io.close()

        f = form.save(commit=False)
        f.rank_score = 0.0
        f.submitter = self.request.user
        f.save()

        return super(CreateView, self).form_valid(form)
如果是text/html,则运行这些代码

from PIL import Image
import io, uuid, requests, lxml.html

url = ("http://website.com")
page = requests.get(url)
hash = str(uuid.uuid1())
tree = lxml.html.fromstring(page.content)
og = tree.xpath('/html/head/meta[@property="og:image"][1]/@content')
r = requests.get(og[0])
i = Image.open(io.BytesIO(r.content)).convert('RGB')
crop_image = ImageOps.fit(i, method=Image.ANTIALIAS, size=(65,65), bleed=0.5, centering=(0.5, 0.5))
crop_image.save("{}.jpeg".format(hash))
我试过“如果”和“其他”的方法,但都没用。我不知道如何将第二段代码实现为第一段代码。这两种代码本身都可以完美地工作

我尝试了以下代码:

if page.headers['Content-Type'] == 'text/html:
    .....
elif page.headers['Content-Type'] == 'image/':
    ..... 
if page.headers['Content-Type'] == 'text/html:
    .....
elif page.headers['Content-Type'] == 'image/':
    .....
多亏了LearnerEarner,我的问题解决了。工作代码如下

class LinkCreateView(CreateView):
    model = Link
    form_class = LinkForm

    def form_valid(self, form):
        r = requests.get(form.instance.url)
        image_io = io.BytesIO()
        hash = str(uuid.uuid1())
        try:
            if r.headers['Content-Type'].startswith("image/"):
                i = Image.open(io.BytesIO(r.content)).convert('RGB')
                crop_image = ImageOps.fit(i, method=Image.ANTIALIAS, size=(65, 65), bleed=0.5, centering=(0.5, 0.5))
                name = "{}.jpeg".format(hash)
                crop_image.save(image_io, format="jpeg")
                form.instance.img.save(name, ContentFile(image_io.getvalue()))
            elif r.headers['Content-Type'].startswith("text/html"):
                tree = lxml.html.fromstring(r.content)
                og = tree.xpath('/html/head/meta[@property="og:image"][1]/@content')
                r = requests.get(og[0])
                i = Image.open(io.BytesIO(r.content)).convert('RGB')
                crop_image = ImageOps.fit(i, method=Image.ANTIALIAS, size=(65, 65), bleed=0.5, centering=(0.5, 0.5))
                name = "{}.jpeg".format(hash)
                crop_image.save(image_io, format="jpeg")
                form.instance.img.save(name, ContentFile(image_io.getvalue()))
        finally:
            image_io.close()

        f = form.save(commit=False)
        f.rank_score = 0.0
        f.submitter = self.request.user
        f.save()

        return super(CreateView, self).form_valid(form)
我尝试了以下代码:

if page.headers['Content-Type'] == 'text/html:
    .....
elif page.headers['Content-Type'] == 'image/':
    ..... 
if page.headers['Content-Type'] == 'text/html:
    .....
elif page.headers['Content-Type'] == 'image/':
    .....
就我所知,没有像“image/”这样的通用内容类型(除非您在响应头中显式发送此类内容类型)。MIME类型必须是特定的

打印并观察
请求中的响应标题。在else条件下使用它之前,请获取
以查看确切的内容类型

如果您所期望的只是HTML和图像,那么您不需要为图像设置特定的条件。您可以尝试以下方法:

if page.headers['Content-Type'] == 'text/html':
    ....
else:
    try:
        #treat it as image and proceed
    except:
        #may be not an image

您可以这样做:

if page.headers['Content-Type'] == 'text/html:
    .....
elif page.headers['Content-Type'].startswith("image/"):
    .....

请参考这一点。

几点。首先,您应该提供更多的上下文和一些示例URL等。例如,我需要为此导入什么?第二,我不明白你所说的“我尝试过如果,其他事情”是什么意思。If应该是一个简单的If页面。headers['content-type']=type thing…@SteveCohen我更新了这个问题。我的意思是我试过这些代码。比如:page.header['content-type]'=='text/html'是的,但我不想只选择特定的类型。我想要image/jpeg、image/png、image/gif等等@Yunus用检查图像内容类型的通用方法编辑了答案,非常感谢。我的问题解决了。我用工作代码更新了我的问题。@Yunus Nice。你是wc。一个建议是,如果可以,最好在If语句中使用“==”比较来管理条件检查。如果要比较整个字符串,如“text/html”,则无需使用startswith(),如果我只做==“text/html”代码不起作用。我将“text/html”改为“text/html”;字符集=UTF-8'',则代码正在工作。“charset=UTF-8”部分可能是可变的。你怎么认为?是所有网站的默认字符集吗?