2009-06-14 12 views
1

Je bloque certains referers dans mon fichier .htacccess pour éviter de diffuser des images sur des sites warez. Les images sont directement servies afin que Django ne les touche pas et je voudrais que ça continue comme ça à cause des performances.Modifier .htaccess depuis l'administrateur Django

Mais je voudrais pouvoir ajouter plus de sites bloqués à la liste dans le fichier .htaccess en utilisant l'admin Django, sans avoir à utiliser FTP ou SVN pour accéder au site. Est-ce possible? Comment?

Répondre

3

Vous pouvez créer un modèle qui définit toute la partie configurable de .htaccess; Ensuite, ajoutez un signal (django doc) à chaque sauvegarde, pour appeler une fonction qui écrira un nouveau fichier .htaccess en fonction de ce qui a été défini sur la base de données.
Quelque chose comme ça (comme d'habitude, ce code non testé est!):

class HtAccessExclusion(models.Model): 
    exclusion = models.CharField(max_length=300) 

from django.db.models.signals import post_save 

def export_on_htaccess(sender, **kwargs): 
    # write "standard" part of htaccess 
    # use the content of HtAccessExclusion table to write all specific exclusions 
    ... 

post_save.connect(export_on_htaccess, sender=HtAccessExclusion) 
+1

Aha, les signaux! Je savais qu'ils étaient bons pour quelque chose. –

+0

Donc, j'ai effectivement mis en œuvre cela et cela fonctionne bien, juste eu à modifier pre_save.connect() à post_save.connect(), évidemment ... –

+0

Oui, vous avez raison. Maintenant, je l'ai corrigé. –

1

Je ne sais pas s'il me manque quelque chose ici, mais n'est-ce pas quelque chose comme ça?

def add_to_htaccess(line): 
    htaccess = open("/path/to/.htaccess", "a") 
    htaccess.write(line+"\n") 
    htaccess.close() 
+0

Eh bien d'abord, les sites bloqués ne sont pas à la fin de l'.htaccess donc je ne peux pas ajouter cela. Il doit être inséré. Deuxièmement, je pensais à une interface utilisateur, peut-être plus ou moins automatiquement créée par Django pour moi, plutôt qu'à l'opération d'écriture de fichier elle-même. –

0

Vous pourriez avoir un temps assez difficile de faire cela de l'application admin, mais vous pouvez probablement faire une application vous faire cela dans une douzaine de lignes de code, ainsi que quelques autres pour les modèles.

-1

Ecrivez une application personnalisée mais réutiliser les modèles d'administration:

{% extends "admin/base_site.html" %} 
{% load adminmedia %} 

{% block coltype %}flex{% endblock %} 
{% block bodyclass %}change-list{% endblock %} 

{% block breadcrumbs %}<div class="breadcrumbs"><a href="/admin/">Home</a>&nbsp;&rsaquo;&nbsp;{{page_title}}</div>{% endblock %} 
{% block content %} 
....Your code here.... 
{% endblock %} 

Ajouter à votre URL avant de les URL d'administration et à toutes fins utiles, il fait partie de l'admin. Vous pouvez personnaliser vos modèles d'administration pour inclure des liens dans les outils objet ou dans le menu principal si vous le souhaitez.

+1

Pourquoi feriez-vous cela? Pourquoi ne pas simplement écrire une application régulière et l'enregistrer avec l'administrateur? –

+0

Cela vous achètera seulement créer/mettre à jour et supprimer des pages. C'est pour quand vous avez besoin de pages qui semblent faire partie de l'administrateur mais qui sont basées sur vos propres fonctions d'affichage. –

2

Vous trouverez peut-être plus facile d'utiliser mod_rewrite vaudou et d'utiliser un RewriteMap pour contenir la liste des sites à bloquer avec une condition de réécriture pour vérifier la carte. Cela a l'avantage que la seule chose dans le fichier de carte sera la liste des sites et donc la mise à jour est plus facile. Le fichier map sera également rechargé automatiquement par Apache lorsqu'il aura été mis à jour. Vous devrez peut-être placer les règles de réécriture pour cela dans la configuration principale d'Apache.

Questions connexes