2010-09-28 2 views
1

J'ai une base de données .sql avec laquelle j'interagis avec Django. La base de données au début est remplie de données publiques accessibles à partir de n'importe qui. Plusieurs utilisateurs individuels peuvent ajouter des lignes dans une table (données privées). Comment un utilisateur ne peut-il voir que les modifications qu'il a effectuées dans la base de données (données privées)?Plusieurs utilisateurs individuels sur une base de données

Répondre

0

Je suppose que les utilisateurs doivent se connecter à cette application. Si oui, ajoutez une colonne à chaque table pour le nom d'utilisateur. Ajoutez WHERE username = ? à chaque requête afin qu'ils ne puissent voir que leurs données.

Pour les demandes de manipulation de données, assurez-vous que le nom d'utilisateur correspond à la valeur de chaque ligne; interdire l'opération si ce n'est pas vrai.

2

Je suppose que vous utilisez django.contrib.auth. Vous avez juste besoin de faire quelque chose comme:

from django.contrib.auth.models import User 

# ... 

class PrivateData(models.Model): 
    # ... private data fields ... 
    user = models.ForeignKey(User) 

Ensuite, vous pouvez obtenir seulement les champs de cet utilisateur avec:

PrivateData.objects.filter(user=request.user) 

EDIT: Donc, si vos utilisateurs ne sont que les adresses IP, et vous ne l'utilisez un mécanisme de connexion, vous n'avez pas vraiment besoin django.contrib.auth ... bien qu'il soit bon d'avoir de toute façon puisque vous pouvez l'utiliser pour authentifier vous-même et d'utiliser l'administrateur intégré pour gérer votre site.

Si vous voulez juste de lier les données aux adresses IP, mise en place d'un modèle IPUser:

class IPUser(models.Model): 
    address = models.CharField(max_length=64, unique=True) # Big enough for IPv6 
    # Add whatever other discrete (not list) data you want to store with this address. 

class PrivateData(models.Model): 
    # ... private data fields ... 
    user = models.ForeignKey(IPUser) 

La fonction d'affichage ressemble à quelque chose comme:

def the_view(request): 
    remoteAddr = request.META['REMOTE_ADDR'] 
    try: 
     theUser = IPUser.objects.get(address=remoteAddr) 
    except IPUser.DoesNotExist: 
     theUser = IPUser.objects.create(address=remoteAddr) 
    userModifiedData = PrivateData.objects.filter(user=theUser) 

Une chose à noter: quand vous » re tester ceci avec manage.py runserver, vous devrez spécifier l'adresse IP via la variable d'environnement:

$ REMOTE_ADDR=127.0.0.1 manage.py runserver 

Lorsque vous utilisez Django avec un vrai serveur web comme Apache, le serveur va définir la variable pour vous.

Il y a probablement plusieurs façons d'optimiser ceci, mais cela devrait vous aider à démarrer.

+0

Je n'ai pas beaucoup lu sur contrib.auth mais si je suppose que vous devez définir différents noms d'utilisateur afin de les distinguer, mais les seules choses qui peuvent distinguer mes utilisateurs est leur ip – thikonom

Questions connexes