Skip to content

Commit

Permalink
Merge pull request #297 from goranpavlovic/master
Browse files Browse the repository at this point in the history
Python > 3.5 (3.5 - 3.9) and django > 2.x and 3.x (latest tested is 3.2.2)
  • Loading branch information
jrief committed May 12, 2021
2 parents 4723874 + 772d9eb commit 318dde3
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 51 deletions.
76 changes: 61 additions & 15 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,95 @@ language: python

python:
- 2.7
- 3.4
- 3.5
- 3.6
- 3.7
- 3.8
- 3.9

env:
- DJANGO=1.7.11
- DJANGO=1.8.19
- DJANGO=1.9.13
- DJANGO=1.10.8
- DJANGO=1.11.13
- DJANGO=2.0.5
- DJANGO=2.1.5
- DJANGO=1.11.29
- DJANGO=2.0.13
- DJANGO=2.1.15
- DJANGO=2.2.22
- DJANGO=3.0.14
- DJANGO=3.1.10
- DJANGO=3.2.2

branches:
only:
- master

matrix:
exclude:
- env: DJANGO=1.7.11
python: 3.4
- env: DJANGO=1.7.11
python: 3.5
- env: DJANGO=1.7.11
python: 3.6
- env: DJANGO=1.7.11
python: 3.7
- env: DJANGO=1.7.11
python: 3.8
- env: DJANGO=1.7.11
python: 3.9
- env: DJANGO=1.8.19
python: 3.6
- env: DJANGO=1.8.19
python: 3.4
python: 3.7
- env: DJANGO=1.8.19
python: 3.5
python: 3.8
- env: DJANGO=1.8.19
python: 3.9
- env: DJANGO=1.9.13
python: 3.6
- env: DJANGO=1.9.13
python: 3.4
python: 3.7
- env: DJANGO=1.9.13
python: 3.5
python: 3.8
- env: DJANGO=1.9.13
python: 3.9
- env: DJANGO=1.10.8
python: 3.6
- env: DJANGO=2.0.5
- env: DJANGO=1.10.8
python: 3.7
- env: DJANGO=1.10.8
python: 3.8
- env: DJANGO=1.10.8
python: 3.9
- env: DJANGO=1.11.29
python: 3.8
- env: DJANGO=1.11.29
python: 3.9
- env: DJANGO=2.0.13
python: 2.7
- env: DJANGO=2.0.13
python: 3.8
- env: DJANGO=2.0.13
python: 3.9
- env: DJANGO=2.1.15
python: 2.7
- env: DJANGO=2.1.15
python: 3.8
- env: DJANGO=2.1.15
python: 3.9
- env: DJANGO=2.2.22
python: 2.7
- env: DJANGO=3.0.14
python: 2.7
- env: DJANGO=2.1.5
- env: DJANGO=3.0.14
python: 3.5
- env: DJANGO=3.1.10
python: 2.7
- env: DJANGO=3.1.10
python: 3.5
- env: DJANGO=3.2.2
python: 2.7
- env: DJANGO=2.1.5
python: 3.4
- env: DJANGO=3.2.2
python: 3.5

install:
- pip install -r examples/requirements.txt
Expand All @@ -58,4 +104,4 @@ before_script:
- pip freeze

script:
- cd examples && ./manage.py migrate && ./manage.py test chatserver --settings=chatserver.tests.settings
- cd examples && ./manage.py migrate --settings=chatserver.tests.settings && ./manage.py test chatserver --settings=chatserver.tests.settings
6 changes: 5 additions & 1 deletion examples/chatserver/templatetags/tutorial_tags.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# -*- coding: utf-8 -*-
from django import template
from django.core.urlresolvers import reverse

try:
from django.core.urlresolvers import reverse
except ImportError as e:
from django.urls import reverse

register = template.Library()

Expand Down
72 changes: 52 additions & 20 deletions examples/chatserver/tests/settings.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import django
from distutils.version import StrictVersion
# Django settings for unit test project.

DEBUG = True
Expand Down Expand Up @@ -37,20 +39,38 @@
SESSION_REDIS_PREFIX = 'session'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.app_directories.Loader',
)
if StrictVersion(django.get_version()) < StrictVersion('2.0'):
TEMPLATE_LOADERS = (
'django.template.loaders.app_directories.Loader',
)

TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.static',
'django.core.context_processors.request',
'ws4redis.context_processors.default',
)
else:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'OPTIONS': {
'loaders': (
'django.template.loaders.app_directories.Loader',
),
'context_processors': {
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.static',
'django.core.context_processors.request',
'ws4redis.context_processors.default',
'django.contrib.messages.context_processors.messages'
}
}
},
]

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'


TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.static',
'django.core.context_processors.request',
'ws4redis.context_processors.default',
)

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
Expand All @@ -65,15 +85,27 @@

# These two middleware classes must be present, if messages sent or received through a websocket
# connection shall be delivered to an authenticated Django user.
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',
)
if StrictVersion(django.get_version()) < StrictVersion('2.0'):
print("DEBUG " + django.get_version())
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',
)
else:
print("DEBUG " + django.get_version())
MIDDLEWARE = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

# This setting is required to override the Django's main loop, when running in
# development mode, such as ./manage runserver
Expand Down
18 changes: 9 additions & 9 deletions examples/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
backports.ssl-match-hostname==3.4.0.2
django-nose
django-redis-sessions==0.5.0
backports.ssl-match-hostname==3.7.0.1
django-nose==1.4.7
django-redis-sessions==0.6.2
django-websocket-redis==0.4.5
gevent==1.0.2
greenlet==0.4.9
gevent==21.1.2
greenlet==1.1.0
nose==1.3.7
redis==2.10.3
requests==2.20.0
six==1.10.0
websocket-client==0.35.0
redis==3.5.3
requests==2.25.1
six==1.16.0
websocket-client==0.59.0
12 changes: 9 additions & 3 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def convert(filename, fmt):
with io.open(filename, encoding='utf-8') as fd:
return fd.read()

DESCRIPTION = 'Websocket support for Django using Redis as datastore'
DESCRIPTION = 'Websockets support for Django using Redis as datastore'

CLASSIFIERS = [
'Environment :: Web Environment',
Expand All @@ -22,17 +22,23 @@ def convert(filename, fmt):
'Framework :: Django :: 1.6',
'Framework :: Django :: 1.7',
'Framework :: Django :: 1.8',
'Framework :: Django :: 1.9',
'Framework :: Django :: 2.0',
'Framework :: Django :: 3.0',
'Framework :: Django :: 3.1',
'Framework :: Django :: 3.2',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules',
'Development Status :: 4 - Beta',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
]

setup(
Expand Down
5 changes: 4 additions & 1 deletion ws4redis/django_runserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
from django.core.servers.basehttp import WSGIServer, ServerHandler as _ServerHandler, WSGIRequestHandler as _WSGIRequestHandler
from django.conf import settings
from django.core.management.commands import runserver
from django.utils.six.moves import socketserver
try:
from django.utils.six.moves import socketserver
except ModuleNotFoundError as e:
import socketserver
from django.utils.encoding import force_str
from ws4redis.websocket import WebSocket
from ws4redis.wsgi_server import WebsocketWSGIServer, HandshakeError, UpgradeRequiredError
Expand Down
6 changes: 4 additions & 2 deletions ws4redis/wsgi_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,10 @@ def __call__(self, environ, start_response):
logger.warning('Starting late response on websocket')
status_text = http_client.responses.get(response.status_code, 'UNKNOWN STATUS CODE')
status = '{0} {1}'.format(response.status_code, status_text)
headers = response._headers.values()
if six.PY3:
headers = response._headers.values() if hasattr(response, '_headers') else \
[(item, response.headers[item]) for item in response.headers]

if six.PY3 and not isinstance(headers, list):
headers = list(headers)
start_response(force_str(status), headers)
logger.info('Finish non-websocket response with status code: {}'.format(response.status_code))
Expand Down

0 comments on commit 318dde3

Please sign in to comment.