Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

render throws error AttributeError META - (Exception location: __getattr__ in urllib2)

I followed this article to try to load images from an external website. I am trying to pull all the images from an external link. I have used BeautifulSoup to parse the link and get all the required links.

Before the view calls the render() function at the end of the code, image_list and return_dict have the desired values. However the render function seems to be generating the AttributeError exception. Please assist.

I get the following error:

    AttributeError at /post/add_new/
    META
    Request Method: POST
    Request URL:    http://localhost:8000/post/add_new/
    Django Version: 1.4.1
    Exception Type: AttributeError
    Exception Value:    
    META
    Exception Location: C:\Python27\lib\urllib2.py in __getattr__, line 225
    Python Executable:  C:\Python27\python.exe
    Python Version: 2.7.3
    Python Path:    
    ['C:\\Users\\Talal\\Python Workspace\\talal_ynd',
     'C:\\Python27\\lib\\site-packages\\ipython-0.13-py2.7.egg',
     'C:\\Python27\\lib\\site-packages\\pyreadline-2.0_dev1-py2.7-win32.egg',
     'C:\\Python27\\lib\\site-packages\\pil-1.1.7-py2.7-win32.egg',
     'C:\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg',
     'C:\\windows\\system32\\python27.zip',
     'C:\\Python27\\DLLs',
     'C:\\Python27\\lib',
     'C:\\Python27\\lib\\plat-win',
     'C:\\Python27\\lib\\lib-tk',
     'C:\\Python27',
     'C:\\Python27\\lib\\site-packages']
    Server time:    Thu, 13 Sep 2012 17:30:45 +0500

Here is my view file:

# Create your views here.
from django.shortcuts import render
from django.http import HttpResponseRedirect
from posts.models import Post, PostForm
from django.template.loader import get_template
from talal_ynd.settings import TEMPLATE_DIRS


def post_view(request):
    if request.method == 'POST':
        post_form = PostForm(request.POST)
        if post_form.is_valid():
            success_message = 'Thank you.'

            link = post_form.cleaned_data['link']
            if 'get_link' in request.POST:
                import urllib2
                request = urllib2.Request(link)
                response = urllib2.urlopen(request)
                html=response.read()
                from BeautifulSoup import BeautifulSoup
                soup=BeautifulSoup(html)
                import re
                title=''; description=''
                description=soup.findAll('meta',
                    attrs={'name':re.compile("description$",
                        re.I)})[0].get('content')
                try: 
                    title=soup.findAll('meta',
                        attrs={'name':re.compile("^title$",re.I)})[0].get('content')
                except:
                    pass
                if not title:
                    title=soup.title.string
                max_images=10
                image_tags=soup.findAll('img',limit=max_images)
                image_urls_list=[]
                image_urls_list2=[]
                from urlparse import urljoin
                for image_tag in image_tags:
                    url=image_tag.get('src')
                    #image_urls_list.append(request.build_absolute_uri(url))#urljoin(link,url))#HttpRequest.build_absolute_uri(url))
                    #image_urls_list.append(request.urljoin(link,url))
                    image_urls_list.append(url)
                image_list=[]
                for url in image_urls_list:
                    image_list.append({'url':url})
                return_dict={'title':title, 'description':description}
                return_dict.update({'images':image_list})

            else:
                post_form = PostForm()
    else:

        post_form = PostForm()


    return render(request, 'posts/post_form.html', locals())
like image 591
Talal Avatar asked Sep 14 '12 11:09

Talal


1 Answers

You've overwritten the request variable inside your function, because you reused it for the call to urllib2.Request. Use a different variable name there.

like image 139
Daniel Roseman Avatar answered Nov 07 '22 14:11

Daniel Roseman