Подскажите пожалуйста, как правильно установить DjangoBB?
Все делаю по мануалу https://bitbucket.org/slav0nic/djangobb/wiki/QuickInstall
И когда выполняю команду
./manage.py syncdb --all
Вылетает сообщение об ошибке:
/usr/local/lib/python2.7/dist-packages
/django_haystack-2.3.1-py2.7.egg/haystack/utils/__init__.py:12: RemovedInDjango19Warning: django.utils.importlib will be removed in Django 1.9.
from django.utils import importlib
Traceback (most recent call last):
File "./manage.py", line 10, in
File "/usr/local/lib/python2.7/dist-packages
/Django-1.8.4-py2.7.egg/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages
/Django-1.8.4-py2.7.egg/django/core/management/__init__.py", line 312, in execute
django.setup()
File "/usr/local/lib/python2.7/dist-packages
/Django-1.8.4-py2.7.egg/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages
/Django-1.8.4-py2.7.egg/django/apps/registry.py", line 108, in populate
app_config.import_models(all_models)
File "/usr/local/lib/python2.7/dist-packages
/Django-1.8.4-py2.7.egg/django/apps/config.py", line 198, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/local/lib/python2.7/dist-packages
/djangobb_forum-0.0.1a0-py2.7.egg/djangobb_forum/models.py", line 48, in
File "/usr/lib/python2.7/posixpath.py", line 73, in join
path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 10: ordinal not in range(128)
settings.py
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
# Additional locations of static files
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT,'project_static'),
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
Ответ
Изначально данное руководство было написано в средине августа 2015 и опубликовано на Stack Overflow на английском
На данный момент DjangoBB состоит из двух Git частей:
3 ветки для самого приложения (stable, default и bootstrap3) и
2 ветки для проектра (default и dimka665/*********)
1) stable/default/botstrap3 — означает DjangoBB_Forum как приложение (App). Stable ветка имеет последнюю версию кода, по этому будем использовать именно ее.
Source (Исходники)
Zip archive (тоже самое, но в архиве)
2) default — Скелет\Структура Django проекта со всеми настройками (urls.py, settings.py, templates, и тд.), которые требуются для запуска приложения 'DjangoBB_Forum'. Это ТОЛЬКО скелет\структура проекта (подобно тому, что делает Django команда ./manage.py startproject) и НЕ включает в себя DjangoBB_Forum.
Source (Исходники)
Zip archive (тоже самое, но в архиве)
Скачиваем оба архива, распаковываем их и для удобства переименовываем 2 папки, которые мы получили (обе папки имеют изначальное имя 'slav0nic-djangobb-****') в DjangoBB_App для 'stable' ветки приложения и в DjangoBB_Project для 'default' ветки проекта. (Мы собираемся объединить файлы обоих архивов)
Инсталяция.
На сегодняшний день (19.09.2015) последняя версия Django - 1.8.4. Этот мануал также 100% подходит для 1.8.2 и 1.8.3. Я не тестил более ранние версии Django.
На данный момент требования у DjangoBB_Forum следующие:
Django>=1.6,<1.9 (последняя актуальная стабильная версия 1.8.4)
django-haystack>=2.1.0,<2.4 (актуальная версия на время написания руководства - 2.4)
Pillow>=2.1.0 (актуальная версия 2.9.0)
postmarkup (актуальная версия 1.2.2)
pygments (актуальная версия 2.0.2)
pytz>=2015.4 (эта версия является актуальной)
django-pagination-py3==1.1.1 (эта версия является актуальной)
django-allauth (актуальная версия 0.23.0)
django-messages (актуальная версия 0.5.1)
django-nocaptcha-recaptcha (актуальная версия 0.0.18)
whoosh (актуальная версия 2.7.0)
Самая большая проблема с интегрированием DjangoBB_Forum в существующий проект являются настройки, потому как они различаются от пользователя к пользователю. На примере свой структуры проекта я продемонстрирую настройки urls.py и settings.py, что поможет вам интегрировать настройки в свой проект благодаря всем необходимым объяснениями. Перед тем, как использовать настройки файла settings.py указанные ниже, вы должны изменить свои настройки Базы Данных (в секции DATABASES) на свои собственные настройки БД. Также, намного ниже вы увидите 2ой скриншот с заметками для файлов\папок, которые объясняют, что вам нужно поменять в settings.py, потому как наверняка имеете другие абсолютные пути и наверное, относительные пути тоже.
Так же хочу отметить, что на скришнотах вместо файла 'settings/settings.py', вы увидите 3 других файла (default_settings.py, development.py, production.py). По этому в руководстве, когда говорится 'settings.py', подразумеваются ВАШ файл 'settings.py', независимо от того, как он у вас назван, а не один из этих 3х файлов.
Изначальная структура проекта, которая готова принять к себе djangobb_forum (app_shows_and_times и app_places используются только для того, чтоб создать ощущение существующего проекта к которому мы добавляем djangobb_forum):
/src/bugaga/urls.py
"""bugaga URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.8/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Add an import: from blog import urls as blog_urls
2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls))
"""
from django.conf.urls import *
from django.conf import settings
from django.contrib import admin
from django.conf.urls.static import static
from djangobb_forum import settings as forum_settings
from djangobb_forum.sitemap import SitemapForum, SitemapTopic
sitemaps = {
'forum': SitemapForum,
'topic': SitemapTopic,
}
urlpatterns = patterns('',
# Admin
url(r'^admin/', include(admin.site.urls)),
# Sitemap
url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),
#My_Apps
url(r'^places/', include('app_places.urls')),
url(r'^shows/', include('app_shows_and_times.urls')),
# DjangoBB_Forum
url(r'^forum/account/', include('allauth.urls')),
url(r'^forum/', include('djangobb_forum.urls', namespace='djangobb')),
)
# PM Extension
if (forum_settings.PM_SUPPORT):
urlpatterns += patterns('',
url(r'^forum/pm/', include('django_messages.urls')),
)
if (settings.DEBUG):
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
/src/bugaga/settings/development.py
# -*- coding: utf-8 -*-
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
DEBUG = True
TEMPLATE_DEBUG = DEBUG
#print ("base dir path", BASE_DIR)
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'name_of_db',
'USER': 'login_to_db',
'PASSWORD': 'pass_to_db',
'HOST': 'localhost',
'PORT': '',
}
}
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'ru-RU'
LANGUAGES = (
('ca', 'Catalan'),
('cs', 'Czech'),
('de', 'German'),
('en', 'English'),
('es', 'Spanish'),
('fo', 'Faroese'),
('fr', 'France'),
('it', 'Italian'),
('lt', 'Lithuanian'),
('mn', 'Mongolian'),
('nl', 'Dutch'),
('pl', 'Polish'),
('ru', 'Russian'),
('uk_UA', 'Ukrainian'),
('vi', 'Vietnamese'),
('zh_CN', 'Chinese'),
)
SITE_ID = 1
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Europe/Kiev'
USE_TZ = True
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True
# STATIC_ROOT is where the static files get placed from STATIC_URL and STATICFILES_DIRS
# when they are collected by "manage.py collectstatic". Static files are used by Apache
ginx
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
#When you’re developing using Django’s development server, you won’t have anything to do with this setting.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = "/home/antonio/projects/bugaga.com/static/"
# URL prefix for static files in your apps
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'
# STATICFILES_DIRS is a setting you use to declare non app-specific static files
# You can prefixes for templates, as STATICFILES_DIRS = (("downloads", "/opt/webfiles/stats"),)
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
#'/var/www/static/',
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder', # is default; responsible for STATICFILES_DIRS
'django.contrib.staticfiles.finders.AppDirectoriesFinder', # is default; responsible for $app_name/static/
'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = '/home/antonio/projects/bugaga.com/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'YOUR_SECRET_KEY GENERATED BY DJANGO'
# Make this unique, and don't share it with anybody.
if not hasattr(globals(), 'SECRET_KEY'):
SECRET_FILE = os.path.join(BASE_DIR, 'secret.txt')
try:
SECRET_KEY = open(SECRET_FILE).read().strip()
except IOError:
try:
from random import choice
import string
symbols = ''.join((string.lowercase, string.digits, string.punctuation ))
SECRET_KEY = ''.join([choice(symbols) for i in range(50)])
secret = file(SECRET_FILE, 'w')
secret.write(SECRET_KEY)
secret.close()
except IOError:
raise Exception('Please create a %s file with random characters to generate your secret key!' % SECRET_FILE)
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',
'django.middleware.security.SecurityMiddleware',
#DjangoBB_Forum part
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.locale.LocaleMiddleware',
'pagination.middleware.PaginationMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'djangobb_forum.middleware.LastLoginMiddleware',
'djangobb_forum.middleware.UsersOnline',
'djangobb_forum.middleware.TimezoneMiddleware',
)
ROOT_URLCONF = 'bugaga.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# Directories where the engine should look for template source files, in search order.
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
#DjangoBB_Forum part
'django.template.context_processors.i18n',
'django.template.context_processors.media',
'django.template.context_processors.static',
'django_messages.context_processors.inbox',
#'allauth.account.context_processors.account', #not required since v0.21.0
#'allauth.socialaccount.context_processors.socialaccount', #not required since v0.21.0
'djangobb_forum.context_processors.forum_settings',
],
#DjangoBB_Forum part
#'loaders': [
# 'django.template.loaders.filesystem.Loader', #is the same as DIRS [] not empty
# 'django.template.loaders.app_directories.Loader', #is the same as APP_DIRS = True
# 'django.template.loaders.eggs.Loader',
#]
},
},
]
PREREQ_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MY_APPS = [
'app_places',
'app_shows_and_times',
]
DJANGOBB_APPS = [
'django.contrib.sites', #required by django-allauth
'django.contrib.sitemaps',
'django.contrib.admindocs',
'django.contrib.humanize',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.openid',
#'allauth.socialaccount.providers.facebook', # at first you need to configure Facebook or
# you will get Error: No Facebook app configured: please add a SocialApp using the Django admin
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.twitter',
'allauth.socialaccount.providers.vk',
'pagination',
'haystack',
'django_messages',
'nocaptcha_recaptcha',
'djangobb_forum',
]
INSTALLED_APPS = PREREQ_APPS + MY_APPS + DJANGOBB_APPS
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
try:
import mailer
INSTALLED_APPS += ('mailer',)
EMAIL_BACKEND = "mailer.backend.DbBackend"
except ImportError:
pass
try:
import south
INSTALLED_APPS += ('south',)
SOUTH_TESTS_MIGRATE = False
except ImportError:
pass
FORCE_SCRIPT_NAME = ''
# Haystack settings
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'djangobb_forum/djangobb_index'),
'INCLUDE_SPELLING': True,
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# Account settings
ACCOUNT_ACTIVATION_DAYS = 10
LOGIN_REDIRECT_URL = '/forum/'
LOGIN_URL = '/forum/account/login/'
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
# Cache settings
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
# Allauth
ACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_SIGNUP_FORM_CLASS = 'bugaga.forms.SignupForm'
try:
from local_settings import *
except ImportError:
pass
Давайте представим, что у нас есть папка project_name/src гдето в Виртуальной Среде (VirtualEnvironment (вы ведь им пользуетесь? (нормально реализован как встроенное решение в Python начиная с v3.4))), которую мы будем использовать как папку проекта.
Скопируйте все содержимое из djangobb_project/basic_project/media/* в /bugaga.com/media/
Скопируйте все содержимое из djangobb_project/basic_project/templates/* в /bugaga.com/src/templates/
Скопируйте djangobb_project/basic_project/forms.py в /bugaga.com/bugaga.com/src/settings/
Скопируйте из djangobb_app/ следующее:
папку 'djangobb_forum'
файл 'requirements.txt'
файл 'requirements_optional.txt'
в /bugaga.com/bugaga.com/src/
Сейчас у вас должна быть следующая структура (новые вещи помечены черными стрелками)
(на всякий случай — все пункты делаем в консоли). Активируйте свою Виртуальную Среду (она же virtenv)
cd '/bugaga.com/bugaga.com/src/' (тут мой путь к проекту)
запустите pip install -r requirements.txt (pip, как и virtenv\venv, должен был быть уже давно установлен)
pip install -r requirements_optional.txt
pip install django-nocaptcha-recaptcha
pip install whoosh
в /bugaga.com/bugaga.com/src/ создаем файл secret.txt и прописываем любую строку текста на ваше усмотрение, к примеру 'asd423llkmasdi2'
Пробуем запустить ./manage.py runsever и открыть http://127.0.0.1:8000/forum/. Возможно, вы получили ошибку вида:
settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
Это означает, что вам нужно правильно ввести настройки своей БД в /bugaga.com/bugaga.com/src/settings/settings.py. «Из коробки» (т.е по-умолчанию) у нас следующие настройки БД:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Так как я использую PostgreSQL, предоставляю шаблон настроек для PostgreSQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'name_of_db',
'USER': 'login_to_db',
'PASSWORD': 'pass_to_db',
'HOST': 'localhost',
'PORT': '',
}
}
Если вы столкнулись с ошибкой выше, тогда скорее всего вы увидите такую ошибку:
django.db.utils.ProgrammingError: relation "djangobb_forum_forum" does not exist LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "djangobb_…
:)
Чтоб ее пофиксить, запускаем ./manage.py migrate
Далее если видим такую ошибку:
django.db.utils.ProgrammingError: relation "auth_user" does not exist
-> запускаем ./manage.py migrate auth
Если такую:
psycopg2.ProgrammingError: relation "django_site" does not exist LINE 1: SELECT (1) AS "a" FROM "django_site" LIMIT 1
-> запускаем ./manage.py migrate sites
Запускаем ./manage.py migrate - эта команда смигрирует все остальные приложения\пакеты, таким образом вам не нужно мигрировать по отдельности каждое приложение\пакет.
./manage.py makemigrations
./manage.py migrate
Переде тем, как вы сможете открыть в своем браузере форум, вы должны сделать аккаунт форума (./manage.py createsuperuser) иначе получите ошибку:
В браузере: User matching query does not exist.
В консоли: django.contrib.auth.models.DoesNotExist: User matching query does not exist.
Также, чтоб избежать ошибки:
ImportError: No module named 'allauth.account.context_processors'
-> открываем bugaga.com/bugaga.com/src/settings/settings.py и в секции TEMPLATE_CONTEXT_PROCESSORS комментируем (по средствам символа решетки - #) 2 линии, указанные ниже:
# 'allauth.account.context_processors.account',
# 'allauth.socialaccount.context_processors.socialaccount',
Сейчас вы можете открыть свой форум, но осталась 1 проблема с языками. Чтобы ее пофиксить, переходим в /src/djangobb_forum/ и выполняем django-admin compilemessages
Сейчас вы уже все сделали и можете запустить сервер ./manage.py runserver и «Добро пожаловать в DjangoBB_Forum» → http://127.0.0.1:8000/forum/
Комментариев нет:
Отправить комментарий