Skip to content

Commit 18fec21

Browse files
committed
Merge pull request #10 from khj1218/master
Add support for selective read-only db when multi-databases are used
2 parents 0ae0697 + f5557c3 commit 18fec21

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ pip-log.txt
88
/example_project/local_settings.py
99
/docs/html
1010
/docs/doctrees
11+
.idea

readonly/__init__.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
def _readonly():
2929
return getattr(settings, 'SITE_READ_ONLY', False)
3030

31+
def _get_readonly_dbs():
32+
read_on_db_names = []
33+
for db_key in getattr(settings, 'DB_READ_ONLY_DATABASES', tuple()):
34+
db = settings.DATABASES.get(db_key)
35+
if db:
36+
read_on_db_names.append(db['NAME'])
37+
return read_on_db_names
3138

3239
class ReadOnlyCursorWrapper(object):
3340
"""
@@ -54,13 +61,15 @@ class ReadOnlyCursorWrapper(object):
5461
)
5562
_last_executed = ''
5663

57-
def __init__(self, cursor):
64+
def __init__(self, cursor, db):
5865
self.cursor = cursor
66+
self.db = db
5967
self.readonly = _readonly()
68+
self.readonly_dbs = _get_readonly_dbs()
6069

6170
def execute(self, sql, params=()):
6271
# Check the SQL
63-
if self.readonly and self._write_sql(sql):
72+
if self.readonly and self._write_sql(sql) and self._write_to_readonly_db():
6473
raise DatabaseWriteDenied
6574
return self.cursor.execute(sql, params)
6675

@@ -79,10 +88,12 @@ def __iter__(self):
7988
def _write_sql(self, sql):
8089
return sql.startswith(self.SQL_WRITE_BLACKLIST)
8190

91+
def _write_to_readonly_db(self):
92+
return not self.readonly_dbs or self.db.settings_dict['NAME'] in self.readonly_dbs
8293

8394
class CursorWrapper(util.CursorWrapper):
8495
def __init__(self, cursor, db):
85-
self.cursor = ReadOnlyCursorWrapper(cursor)
96+
self.cursor = ReadOnlyCursorWrapper(cursor, db)
8697
self.db = db
8798

8899

readonly/middleware.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ def process_exception(self, request, exception):
2828
from django.contrib import messages
2929
messages.error(
3030
request,
31-
'The site is currently in read-only '
32-
'mode. Please try editing later.')
31+
getattr(settings, 'DB_READ_ONLY_ERROR_MESSAGE',
32+
'The site is currently in read-only '
33+
'mode. Please try editing later.'))
3334

3435
# Try to redirect to this page's GET version
3536
return HttpResponseReload(request)
3637
else:
3738
# We can't do anything about this error
3839
return HttpResponse(
39-
'The site is currently in read-only mode. '
40-
'Please try again later.')
40+
getattr(settings, 'DB_READ_ONLY_ERROR_MESSAGE',
41+
'The site is currently in read-only mode. '
42+
'Please try again later.'))

0 commit comments

Comments
 (0)