Question

Je suis nouveau sur Python (je sors de PHP à cause de la gravité de ses défaillances), et je cours à travers le portage de mon ancien code. Une chose:

J'ai un fichier /foo.py avec les fonctions index () et bar (), je peux donc accéder à l'éditeur http: // domain / foo / bar et http: // domain / foo comme le suggère la documentation .

Comment puis-je l'avoir tel que je peux le faire:

http: // domain / foo / bar / a1 / a2 / a3 / un / ...

Tels que l'éditeur lance bar (), puis je peux accéder à l'URL pour obtenir / a1 / a2 / ... Tout ce que je reçois est Interdit :) (je ne veux pas utiliser mod_rewrite sur tout)

Oh, je suis sur 2.5.2 Merci d'avance

MISE À JOUR: La solution idéale serait que l'éditeur lance la résolution la plus à droite dans l'URL qu'il puisse, et rende simplement a1 / a2 / a3 .. accessible via le module apache. Peut-être une combinaison d'une directive apache et d'un éditeur?

RESOLU (ish): La réponse de la méthode magique call (), etc., est juteuse! Bien que je pense que je vais modifier l'éditeur ou écrire le mien pour inspecter les objets de la même manière, en utilisant la correspondance la plus à droite, puis en autorisant le plus à droite à accéder à l'URL à l'aide du module apache. Merci à tous!

Était-ce utile?

La solution

Vous devez définir un objet bar.a1.a2.a3.an dans votre module foo.py . Fondamentalement, le gestionnaire de l'éditeur remplace les barres obliques dans l'URL par des points et tente de trouver un objet Python portant ce nom.

Vous devez définir un objet bar.a1.a2.a3.an dans votre module foo.py . Fondamentalement, le gestionnaire de l'éditeur remplace les barres obliques dans l'URL par des points et tente de trouver un objet Python portant ce nom.

Vous pouvez essayer quelque chose de farfelu: dans foo.py :

class _barclass(object):
    def __init__(self, parent, name):
        if parent and name:
            self.path = parent.path + '/' + name
            setattr(parent, name, self)
        else:
            self.path = ''
    def __getattr__(self, name):
        return _barclass(self, name)
    def __call__(self):
        # do your processing here
        # url path is contained in self.path

bar = _barclass(None, None)

Même si cela met un peu à rude épreuve ce que l’éditeur est censé faire, vous feriez peut-être mieux d’écrire vos propres gestionnaires à partir de zéro. (Ou en utilisant quelque chose comme Django.)

Autres conseils

À mon avis, cela dépasse les capacités de l'algorithme de publication. ( La documentation ne fait certainement pas ' ne le mentionnez pas. ) Vous pourriez écrire votre propre gestionnaire mod_python ( exemple ici ) qui étend toutefois l’algorithme de publication.

Une meilleure solution serait d’examiner mod_wsgi et de créer votre application Web en tant que application WSGI à la place. Vous bénéficierez des étagères et des étagères du middleware WSGI, mais vous pourrez notamment utiliser un logiciel de routage tel que Itinéraires , spécialement conçus pour traiter les cas où la publication d’objets n’est pas assez puissante. Mais je ne connais pas vos délais, cela peut donc être réalisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top