开发者

Multiple individual users on one database

开发者 https://www.devze.com 2023-01-17 19:51 出处:网络
I have a .sql database开发者_高级运维 with which i interact using Django . The database in the beginning is filled with public data that can be accessed from anynone.

I have a .sql database开发者_高级运维 with which i interact using Django . The database in the beginning is filled with public data that can be accessed from anynone. Multiple individual users can add rows into a table(private data). How can a user see only the changes he made in the database(private data)?


I assume you're using django.contrib.auth. You just need to do something like:

from django.contrib.auth.models import User

# ...

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

Then you can get just that user's fields with:

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

EDIT: So, if your users are just IP addresses, and you're not using a login mechanism, you don't really need django.contrib.auth... though it's good to have anyway since you can use it to authenticate yourself and use the built-in admin stuff to manage your site.

If you just want to tie data to IP addresses, set up an IPUser model:

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)

The view function looks something like:

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)

One thing to note: when you're testing this with manage.py runserver, you'll need to specify the IP address via environment variable:

$ REMOTE_ADDR=127.0.0.1 manage.py runserver

When you use Django with a real web server like Apache, the server will set the variable for you.

There are probably several ways to optimize this, but this should get you started.


I'm assuming that users have to log into this application. If yes, add a column to every table for the username. Add WHERE username = ? to every query so they can see only their data.

For data manipulation requests, make sure that the username matches the value for every row; forbid the operation if not true.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号