2010-03-14 5 views
2

Hey, j'ai fait quelques changements à mon env django développement, comme certains d'entre vous ont suggéré. Jusqu'à présent, j'ai réussi à configurer et à l'exécuter avec succès avec postgres.Erreur dans django en utilisant Apache & mod_wsgi

Maintenant, j'essaie d'exécuter l'application en utilisant apache2 et mod_wsgi, mais j'ai rencontré ce petit problème après avoir suivi les directives des docs django.

Quand j'accéder à localhost/myapp/tâches cette erreur soulève:

Request Method: GET 
Request URL: http://localhost/myapp/tasks/ 
Exception Type: TemplateSyntaxError 
Exception Value: 

Caught an exception while rendering: argument 1 must be a string or unicode object 

Original Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/dist-packages/django/template/debug.py", line 71, in render_node 
    result = node.render(context) 
    File "/usr/local/lib/python2.6/dist-packages/django/template/defaulttags.py", line 126, in render 
    len_values = len(values) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 81, in __len__ 
    self._result_cache = list(self.iterator()) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 238, in iterator 
    for row in self.query.results_iter(): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 287, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.py", line 2369, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 19, in execute 
    return self.cursor.execute(sql, params) 
TypeError: argument 1 must be a string or unicode object 
... ... ... 

Et puis il met en évidence un {% pour t dans les tâches%} étiquette de modèle, comme la source du problème est là, mais a bien fonctionné sur le serveur intégré.

La vue associée à cette page est vraiment simple, il suffit d'aller chercher tous les objets Tâche. Et le modèle les affiche simplement sur une table.

En outre, certains pages sont rendus ok. Je ne veux pas remplir cette question avec du code, donc si vous avez besoin de plus d'informations, je serais heureux de le fournir. Merci

EDIT

Donc, voici mon avis:

@login_required 
def tasks(request, msg=''): 
    tasks = Task.objects.all() 
    message = msg 
    return custom_render('user/tasks.html', 
         {'tasks': tasks, 'message':message}, 
         request) 

Et voici mon modèle:

{% block main_content %} 

{% if message %} 
    <p id="message" class="info"> 
     {{message}} 
    </p> 
{% endif %} 

<a href="{% url GProject.myapp.views.new_task %}">Nueva Tarea</a> 

    <table id="tasks-table" > 
     <thead> 
      <tr> 
       <th colspan="4" >{{tasks|length}} tareas pendientes</th> 
      </tr> 
      <tr> 
       <th>#</th> 
       <th>Proyecto</th> 
       <th>Título</th> 
       <th>Estado</th> 
      </tr> 
     </thead> 
     <tbody> 
      {% for t in tasks %} 
       <tr id="row-{{t.id}}" class="{% cycle 'row-0' 'row-1' %} priority-{{ t.priority }}"> 
        <td width="25"> 
         <a href="{% url GProject.myapp.views.view_task t.id %}">{{t.id}}</a> 
        </td> 
        <td> 
         <a href="{% url GProject.myapp.views.view_task t.id %}">{{t.project}}</a> 
        </td> 
        <td width="400"> 
         <a href="{% url GProject.myapp.views.view_task t.id %}"> 
          {{t.title}} 
         </a> 
        </td> 
        <td>{{t.get_status_display}}</td> 
       </tr> 
      {% empty %} 
       <tr><td>No tasks</td></tr> 
      {% endfor %} 

     </tbody> 
    </table> 
{% endblock main_content %} 

Aussi, maintenant que je reçois cette erreur :

TypeError at /admin/tareas/ 

argument 1 must be a string or unicode object 

Request Method: GET 
Request URL: http://localhost/gpro/admin/tareas/ 
Exception Type: TypeError 
Exception Value: 

argument 1 must be a string or unicode object 

Exception Location: /usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py in _cursor, line 105 
Python Executable: /usr/bin/python 
Python Version: 2.5.4 

EDIT

modèle Tâches ressemble à ceci:

class Task(models.Model): 

    project = models.ForeignKey(Project) 
    title = models.CharField(max_length=128) 
    description = models.TextField(max_length=1500) 
    effort = models.IntegerField(null=True, blank=True) 
    priority = models.IntegerField(max_length=1, null=True, blank=True, choices=PRIORITY_VALUES) 
    severity = models.IntegerField(max_length=1, null=True, blank=True, choices=SEVERITY_VALUES) 
    asignee = models.ForeignKey(User, blank=True, null=True, related_name='asignee') 
    milestone = models.ForeignKey(Milestone, blank=True, null=True) 
    created_by = models.ForeignKey(User, blank=True, null=True, related_name='created_by') 
    status = models.IntegerField(max_length=1, choices=STATUS_VALUES, default=1) 
    resolution_comment = models.CharField(max_length=1500, null=True, blank=True) #comentario al resolver la task 
    due_date = models.DateField(blank=True, null=True) 
    created_on = models.DateTimeField(auto_now_add = True) 

    #print  
    def __unicode__(self): 
     return self.title 

custom_render:

def custom_render(template_name, data_dict, request): 
    return render_to_response(template_name, 
           data_dict, 
           context_instance=RequestContext(request)) 
+0

Pouvez-vous modifier la source django et print repr sql et params? Lorsque le code est exécuté sous devserver et apache –

+0

Piotr, je ne sais vraiment pas comment faire ça .. – Nacho

+0

Django ne pointe pas toujours la bonne ligne dans le template. Ne fais pas trop confiance. – Macke

Répondre

0

Juste étant donné que vous ne rencontrez pas le problème en cours d'exécution manage.py runserver, et vous rencontrer le problème en utilisant mod_wsgi, je regarderais les permissions de base de données. D'abord, exécutez-vous mod_wsgi comme le même utilisateur que vous exécutez python manage.py runserver? Sinon, vous devez accorder les permissions utilisateur mod_wsgi. À titre d'exemple, essayer quelque chose comme ça, où apache est le nom du mod_wsgi de fonctionnement de l'utilisateur:

sudo su - postgres 
createuser -S -D -R apache 
psql 
< should now be in the psql shell > 
grant all on database < your database name > to apache; 
+0

Pensez aussi qu'il pourrait s'agir de DB, mais cela n'a pas été fait Je fais le tour. – Nacho

Questions connexes