Skip to content
Snippets Groups Projects
Commit 6889c674 authored by mengfei3's avatar mengfei3
Browse files
parent 79c4a28a
No related branches found
No related tags found
No related merge requests found
...@@ -23,7 +23,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ...@@ -23,7 +23,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
SECRET_KEY = '#4h5=lswbghq65^otbpo16c^c1_@&winj16+nk+8naqc@dv-we' SECRET_KEY = '#4h5=lswbghq65^otbpo16c^c1_@&winj16+nk+8naqc@dv-we'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = False
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']
......
# 当接收到前端发来的消息时,后端会触发ws_message函数 import re
import json
import logging
from channels import Group from channels import Group
# def ws_message(message): from channels.sessions import channel_session
# # ASGI WebSocket packet-received and send-packet message types from .models import Room
# # both have a "text" key for their textual data.
# message.reply_channel.send({ log = logging.getLogger(__name__)
# "text": message.content['text'],
# })
@channel_session
# Connected to websocket.connect websocket连接的时候进行的操作 def ws_connect(message):
def ws_add(message): # Extract the room from the message. This expects message.path to be of the
# Any user connecting to our app will be added to the “users” group and will receive messages sent by the server. # form /chat/{label}/, and finds a Room if the message path is applicable,
message.reply_channel.send({"accept": True}) # and if the Room exists. Otherwise, bails (meaning this is a some othersort
# Add to the chat group # of websocket). So, this is effectively a version of _get_object_or_404.
Group("chat").add(message.reply_channel) try:
prefix, label = message['path'].decode('ascii').strip('/').split('/')
# Connected to websocket.receive 收到消息的时候进行的操作 if prefix != 'chat':
def ws_message(message): log.debug('invalid ws path=%s', message['path'])
Group("chat").send({ return
"text": "[user] %s" % message.content['text'], room = Room.objects.get(label=label)
}) except ValueError:
log.debug('invalid ws path=%s', message['path'])
# Connected to websocket.disconnect 关闭链接的时候进行的操作 return
def ws_disconnect(message): except Room.DoesNotExist:
Group("chat").discard(message.reply_channel) log.debug('ws room does not exist label=%s', label)
# When the client disconnects from our app, the channel is removed from the group, and the user will stop receiving messages. return
# 这里利用了组的概念,在触发连接的时候,把其加入chat组,当收到消息时候,在组内所有用户发送信息,最后关闭连接的时候退出组。
log.debug('chat connect room=%s client=%s:%s',
room.label, message['client'][0], message['client'][1])
# Need to be explicit about the channel layer so that testability works
# This may be a FIXME?
Group('chat-' + label, channel_layer=message.channel_layer).add(message.reply_channel)
message.channel_session['room'] = room.label
@channel_session
def ws_receive(message):
# Look up the room from the channel session, bailing if it doesn't exist
try:
label = message.channel_session['room']
room = Room.objects.get(label=label)
except KeyError:
log.debug('no room in channel_session')
return
except Room.DoesNotExist:
log.debug('recieved message, buy room does not exist label=%s', label)
return
# Parse out a chat message from the content text, bailing if it doesn't
# conform to the expected message format.
try:
data = json.loads(message['text'])
except ValueError:
log.debug("ws message isn't json text=%s", text)
return
if set(data.keys()) != set(('handle', 'message')):
log.debug("ws message unexpected format data=%s", data)
return
if data:
log.debug('chat message room=%s handle=%s message=%s',
room.label, data['handle'], data['message'])
m = room.messages.create(**data)
# See above for the note about Group
Group('chat-' + label, channel_layer=message.channel_layer).send({'text': json.dumps(m.as_dict())})
@channel_session
def ws_disconnect(message):
try:
label = message.channel_session['room']
room = Room.objects.get(label=label)
Group('chat-' + label, channel_layer=message.channel_layer).discard(message.reply_channel)
except (KeyError, Room.DoesNotExist):
pass
...@@ -2,6 +2,7 @@ from __future__ import unicode_literals ...@@ -2,6 +2,7 @@ from __future__ import unicode_literals
import uuid import uuid
import datetime import datetime
from django.db import models from django.db import models
from django.utils import timezone
class FlightRecords(models.Model): class FlightRecords(models.Model):
frid = models.IntegerField(default=0) frid = models.IntegerField(default=0)
...@@ -58,6 +59,30 @@ class FlightSeg(models.Model): ...@@ -58,6 +59,30 @@ class FlightSeg(models.Model):
self.full_clean() self.full_clean()
super(FlightSeg, self).save(*args, **kwargs) super(FlightSeg, self).save(*args, **kwargs)
class Room(models.Model):
name = models.TextField()
label = models.SlugField(unique=True)
def __unicode__(self):
return self.label
class Message(models.Model):
room = models.ForeignKey(Room, related_name='messages')
handle = models.TextField()
message = models.TextField()
timestamp = models.DateTimeField(default=timezone.now, db_index=True)
def __unicode__(self):
return '[{timestamp}] {handle}: {message}'.format(**self.as_dict())
@property
def formatted_timestamp(self):
return self.timestamp.strftime('%b %-d %-I:%M %p')
def as_dict(self):
return {'handle': self.handle, 'message': self.message, 'timestamp': self.formatted_timestamp}
""" """
class Reserved(models.Model): class Reserved(models.Model):
user = models.ForeignKey(User, verbose_name='user_reserved', on_delete=models.CASCADE) user = models.ForeignKey(User, verbose_name='user_reserved', on_delete=models.CASCADE)
......
from django.conf.urls import include, url from django.conf.urls import include, url
from webapp import views from webapp import views
from .views import user_list from .views import log_in, log_out,sign_up, user_list
urlpatterns = [ urlpatterns = [
url(r'^$', views.index, name='index'), url(r'^$', views.index, name='index'),
...@@ -8,8 +8,11 @@ urlpatterns = [ ...@@ -8,8 +8,11 @@ urlpatterns = [
url(r'^mobileapp$', views.mobileapp, name='mobileapp'), url(r'^mobileapp$', views.mobileapp, name='mobileapp'),
url(r'^account$', views.account, name='account'), url(r'^account$', views.account, name='account'),
url(r'^trip$', views.trip, name='trip'), url(r'^trip$', views.trip, name='trip'),
# link to user_list html # link to user_list html, login and logout
url(r'^$', user_list, name='user_list'), url(r'^$', user_list, name='user_list'),
url(r'^log_in/$', log_in, name='log_in'),
url(r'^log_out/$', log_out, name='log_out'),
url(r'^sign_up/$', sign_up, name='sign_up'),
] ]
......
...@@ -6,11 +6,43 @@ from webapp.helper import updateModel, doHash, user_auth ...@@ -6,11 +6,43 @@ from webapp.helper import updateModel, doHash, user_auth
from django.contrib.sessions.backends.db import SessionStore from django.contrib.sessions.backends.db import SessionStore
from django.contrib.sessions.models import Session from django.contrib.sessions.models import Session
import json, datetime import json, datetime
from django.contrib.auth import login, logout
from django.contrib.auth.forms import AuthenticationForm
from django.core.urlresolvers import reverse
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
def user_list(request): def user_list(request):
return render(request, 'example/user_list.html') return render(request, 'example/user_list.html')
def log_in(request):
form = AuthenticationForm()
if request.method == 'POST':
form = AuthenticationForm(data=request.POST)
if form.is_valid():
login(request, form.get_user())
return redirect(reverse('example:user_list'))
else:
print(form.errors)
return render(request, 'example/log_in.html', {'form': form})
def log_out(request):
logout(request)
return redirect(reverse('example:log_in'))
def sign_up(request):
form = UserCreationForm()
if request.method == 'POST':
form = UserCreationForm(data=request.POST)
if form.is_valid():
form.save()
return redirect(reverse('example:log_in'))
else:
print(form.errors)
return render(request, 'example/sign_up.html', {'form': form})
def trip(request): def trip(request):
user = None user = None
token = request.GET.get("token", "") token = request.GET.get("token", "")
...@@ -206,4 +238,44 @@ def query(request): ...@@ -206,4 +238,44 @@ def query(request):
return render(request, 'query.html', context) return render(request, 'query.html', context)
def mobileapp(request): def mobileapp(request):
return render(request, 'mobileapp.html') return render(request, 'mobileapp.html')
\ No newline at end of file
import random
import string
from django.db import transaction
from django.shortcuts import render, redirect
import haikunator
from .models import Room
def about(request):
return render(request, "chat/about.html")
def new_room(request):
"""
Randomly create a new room, and redirect to it.
"""
new_room = None
while not new_room:
with transaction.atomic():
label = haikunator.haikunate()
if Room.objects.filter(label=label).exists():
continue
new_room = Room.objects.create(label=label)
return redirect(chat_room, label=label)
def chat_room(request, label):
"""
Room view - show the room, with latest messages.
The template for this view has the WebSocket business to send and stream
messages, so see the template for where the magic happens.
"""
# If the room with the given label doesn't exist, automatically create it
# upon first visit (a la etherpad).
room, created = Room.objects.get_or_create(label=label)
# We want to show the last 50 messages, ordered most-recent-last
messages = reversed(room.messages.order_by('-timestamp')[:50])
return render(request, "chat/room.html", {
'room': room,
'messages': messages,
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment