0

I'm new to Django, so generally I am the cause of most of my problems, but I can't figure out why the django-guardian 1.3 app won't install. I'm using Django 1.7 in a virtual environment, my OS is Windows 8.1.

I followed the installation directions at pythonhosted.org/django-guardian/installation.html and configuration at pythonhosted.org/django-guardian/configuration.html, but I get an error when I attempt to run the program.

I added 'guardian', ANONYMOUS_USER_ID, and the backends to my settings.py

"""
Django settings for VolunteerManager project.
For more information on this file, see
https://docs.djangoproject.com/en/1.7/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.7/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'Super Super Secret'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []
ANONYMOUS_USER_ID = -1

# Application definition

INSTALLED_APPS = (
#DEFAULT APPS
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

#THIRD PARTY APPS
    'guardian',
    'registration',
        #Copyright (c) 2007-2012, James Bennett
        #All rights reserved.
    'django.contrib.sites',

#LOCAL APPS
    'Volunteer',
)

ACCOUNT_ACTIVATION_DAYS = 7 # One-week activation window;
REGISTRATION_AUTO_LOGIN = True # Automatically log the user in.

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'guardian.backends.ObjectPermissionBackend',
)

ROOT_URLCONF = 'VolunteerManager.urls'


#ANONYMOUS_USER_ID = 'VOLUNTEER_USER_ID'

WSGI_APPLICATION = 'VolunteerManager.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.7/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'volunteer',
        'USER': 'root',
        'PASSWORD': '$',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

# Internationalization
# https://docs.djangoproject.com/en/1.7/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/

STATIC_URL = '/static/'

TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

LOGIN_REDIRECT_URL = '/home/'

SITE_ID = 1

Error picture available on IMGUR

Django-guardian appears to be installed in my virtual environment, but it's still not finding it. Any ideas what I might have done wrong? (Or other suggestions for per-object permissions in Django?) Thank You!

UPDATE: I narrowed the problem down to the virtualenv. When I installed the modules without using virtualenv, then django finds them like it should. I'm still not sure what exactly I did wrong, but this works for now, considering that I'm only working on one project at the moment.

Kienen Mason
  • 1
  • 1
  • 4
  • What does `python -c 'import guardian'` in the virtualenv yield? – dhke Jun 26 '15 at 23:37
  • python -c "import guardian" simply returns the command prompt with no error message, I think that means it's working correctly. – Kienen Mason Jun 28 '15 at 03:11
  • Yeah, it means that the guardian module is accessible. Is it possible that django believes it should use the site-wide packages instead of the virtualenv packages? Did you install django and initialize the project in the virtualenv, too? – dhke Jun 28 '15 at 11:42
  • oh! I initialized the project before installing the virtual environment, then continued working inside it. That must have been the problem. – Kienen Mason Jul 03 '15 at 02:27

2 Answers2

0

I narrowed the problem down to the virtualenv. When I installed the modules without using virtualenv, then django finds them like it should.

You need to activate the virtual environment each time your run django, otherwise you'll continue to run into issues like what you have described.

Activating the virtual environment (by executing Scripts\activate.bat) sets the correct environment variables to that all Python commands are run against the virtual environment's Python installation.

If you do not run the activate.bat file before running Python commands, they will be executed against the system-wide Python installation.

The reason django it works is because you are running django without the virtualenv activated; and you also happen to have django installed in the global Python environment.

Burhan Khalid
  • 169,990
  • 18
  • 245
  • 284
  • Thank you, that does sound like a reasonable answer, but the virtual environment was indeed activated. You can see in the linked picture that my prompt has changed, and django-guardian was installed inside that virtual environment. – Kienen Mason Jul 03 '15 at 02:16
0

For those who encounter the same problem:

The reason might be you don't own the virtualenv folder and all its contents inside, thus

sudo chown -R /path/to/venv

should work.

Vadden
  • 11
  • 2