2013-05-27 4 views
2

Je commence par flask, j'ai passé par de nombreux tutoriels et tout a fonctionné. Mais j'ai démarré ma propre application et je n'ai que l'erreur 404 introuvable.flacon - application facile, mais avec erreur 404 pas trouvé

configuration de mon serveur virtuel apache est:

<VirtualHost domain:80> 
    ServerAdmin [email protected] 
    ServerName domain 
    ServerAlias domain *.domain 

    WSGIDaemonProcess test user=www-data group=www-data threads=5 home=/var/www-py/domain 
    WSGIScriptAlias//var/www-py/domain/domain.wsgi 

<Directory /var/www-py/domain> 
    WSGIProcessGroup test 
    WSGIApplicationGroup %{GLOBAL} 
    WSGIScriptReloading On 
    Order deny,allow 
    Allow from all 
</Directory> 
</VirtualHost> 

domain.wsgi:

import sys, os 

current_dir = os.path.abspath(os.path.dirname(__file__)) 
sys.path.append(current_dir) 
from domain import app as application 

domaine/__ init__.py

import os, sys 
from flask import Flask 
from datetime import * 
from flask.ext.sqlalchemy import SQLAlchemy 

app = Flask(__name__) 
app.debug=True 
app.secret_key = 'mysecretkey' 

db = SQLAlchemy(app) 

domaine/vues/index.py

# -*- coding: utf-8 -*- 
from flask import Flask, request, session, g, redirect, url_for, \ 
abort, render_template, flash 

@app.route('/') 
def index(): 
    return render_template('index.html') 

C'est tout et une application facile. Le problème est que toutes les applications que j'ai essayées ont été écrites dans un dossier. Maintenant, j'essaie de séparer pour classer dans des fichiers pour être plus facile de gérer un plus grand projet. S'il vous plaît pourriez-vous m'aider. Merci.

Répondre

1

Vous avez deux problèmes:

  1. En views/index.py vous ne définissez pas réellement app, ce qui va entraîner une NameError si vous importez jamais réellement views.index.
  2. En __init__.py vous n'importerez jamais views.index alors votre itinéraire ne sera jamais ajouté à la carte Flask.url_routes.

Vous avez deux options:

  1. Vous pouvez prendre les importations circulaires sortir, comme spécifié dans la documentation:

    # views.index 
    from flask import render_template 
    from domain import app 
    
    @app.route("/") 
    def index(): 
        return render_template("index.html") 
    
    # __init__.py 
    
    # ... snip ... 
    db = SQLAlchemy(app) 
    
    # View imports need to be at the bottom 
    # to ensure that we don't run into problems 
    # with partially constructed dependencies 
    # as this is a circular import 
    # (__init__ imports views.index which imports __init__ which imports views.index ...) 
    from views import index 
    
  2. Vous pouvez tirer la création de app en séparer le fichier et éviter les importations circulaires entièrement:

    # NEW: infrastructure.py 
    from flask import Flask 
    from flask.ext.sqlalchemy import SQLAlchemy 
    
    app = Flask("domain") 
    db = SQLAlchemy(app) 
    
    # views.index 
    from domain.infrastructure import app 
    
    # NEW: app.py 
    from domain.infrastructure import app 
    import domain.views.index 
    
    # __init__.py 
    # is now empty 
    
+0

merci pour votre réponse. J'ai essayé votre deuxième solution, elle semble être plus claire pour les grandes applications. Mais ça ne marche pas. A ce moment j'ai reçu l'erreur "TypeError: l'objet 'module' n'est pas appelable". Savez-vous ce que cela peut signifier? – user1743947

+0

@ user1743947 - cela signifie généralement que le symbole que vous regardez est un module, pas un objet appelable. Pouvez-vous publier la totalité de la trace de la pile dans votre question? –

+0

merci, j'ai résolu le problème. J'ai eu une faute de frappe dans le code – user1743947

0

Vous devez importer le fichier views.index dans le domaine/init .py et ajouter "from domain import app" dans index.py. Sinon, il ne peut pas trouver l'application