一.前言

本系列文章的前几篇,博主已经给大家分享过如何在Django框架下构建web用户登陆注册系统和实时视频分享的功能,今天,我们将其整合一下,并添加页面构成一套web用户的交互系统。

二.代码分析

1.代码架构


图1 代码架构

2.主代码分享

online/view.py

#coding=utf-8
from django.shortcuts import render,render_to_response
from django.http import HttpResponse,HttpResponseRedirect
from django.template import RequestContext
from django import forms
from online.models import MyUser
from online.models import Message
from online.models import SystemStatus
from django.contrib.auth import authenticate, login
from django.utils import timezone
import os
import json
import encodings
#表单
class UserForm(forms.Form):
username = forms.CharField(label='用户名',max_length=100)
password = forms.CharField(label='密码',widget=forms.PasswordInput())
#def getuser(forms):
#    return forms.username
#   password1 = forms.CharField(label='重复密码',widget=forms.TextInput())
#   loginaddr="http://127.0.0.1:8000/online/login/"
#   registaddr="http://127.0.0.1:8000/online/regist/"
#注册
def regist(req):
if req.method == 'POST':
uf = UserForm(req.POST)
if uf.is_valid():
#获得表单数据
username = uf.cleaned_data['username']
password = uf.cleaned_data['password']
password1 = req.POST['password1']
#比较数据库中是否已有用户
#user = myUser.objects.all().filter(username = username)
#print(user)
if MyUser.objects.filter(username =username).exists():
return render_to_response('registfaild.html',{'uf':uf}, context_instance=RequestContext(req))
else:
if password1==password:
user=MyUser.objects.create(username= username,password=password)#添加用户进数据库
# profile=UserProfile()#e************************
# profile.user_id=user.id
# profile.phone=phone
# profile.save()
# user = MyUser.objects.create_user(username=username,password=password)
print(user.is_staff) #True
#user.set_password(password)
user.save()
print(user.id)
#user.userID=user.id
#user.save()
#print(user.userID)
#user_sum=MyUser.objects.all().values('username').count()
#user.userID=user_sum
#print(user.userID)
#user.save()
response = HttpResponseRedirect('/online/registsuccee/')
return response
else:
return render_to_response('registfaild1.html',{'uf':uf}, context_instance=RequestContext(req))
else:
uf = UserForm()
return render_to_response('regist.html',{'uf':uf}, context_instance=RequestContext(req))
def createSystemstatus():#创建系统状态信息
#SystemStatus.objects.filter().delete()
SystemRecord=SystemStatus.objects.filter().count()#返回所有状态信息对象
print('SystemRecord = ',SystemRecord)
if SystemRecord == 0:#系统状态信息只创建一个,如已创建,则不再创建
print('create systemstatus')
systemstatus=SystemStatus()
systemstatus.statusName="peopleInfront"
systemstatus.statusValue=-1
systemstatus.statusParam=0
systemstatus.statusDiscirption="no people in front"
systemstatus.save()
print('statusName = ',systemstatus.statusName)
print('statusDiscirption = ',systemstatus.statusDiscirption)
else:
print(' systemstatus had credted')
#登陆
def loginin(req):
#    getAllUser(req)
createSystemstatus()#创建全服务器唯一的系统状态对象
user_firstflag=True #初始化接收用户选择标志位
print(timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S"))
#获取本机IP
#myname = socket.getfqdn(socket.gethostname(  ))
#获取本机ip
#myaddr = socket.gethostbyname(myname)
#print('myname is ',myname,'myaddr = ',myaddr)
if req.method == 'POST':
uf = UserForm(req.POST)
if uf.is_valid():
#获取表单用户密码
username = uf.cleaned_data['username']
password = uf.cleaned_data['password']
#获取的表单数据与数据库进行比较
user = MyUser.objects.filter(username__exact = username,password__exact = password)
#user = authenticate(username=username, password=password)
if user:
#比较成功,跳转index
response = HttpResponseRedirect('/online/index/')
#good="xiaoms"
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
response.set_cookie('user_firstflag',user_firstflag,3600)#成功登陆后,第一次的用户是未选择接收者
return response
else:
#比较失败,跳转loginfaild
return render_to_response('loginfaild.html',{'uf':uf},context_instance=RequestContext(req))
else:
uf = UserForm()
return render_to_response('login.html',{'uf':uf},context_instance=RequestContext(req))
#def loginfaild(req):
#    response = login(req)
#    return response
#
def registsuccee(req):
if req.method == 'POST':
uf = UserForm(req.POST)
if uf.is_valid():
#获取表单用户密码
username = uf.cleaned_data['username']
password = uf.cleaned_data['password']
#获取的表单数据与数据库进行比较
user = MyUser.objects.filter(username__exact = username,password__exact = password)
if user:
#比较成功,跳转index
response = HttpResponseRedirect('/online/index/')
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
return response
else:
#比较失败,跳转loginfaild
return render_to_response('loginfaild.html',{'uf':uf},context_instance=RequestContext(req))
else:
uf = UserForm()
#return render_to_response('registfaild.html',{'uf':uf},context_instance=RequestContext(req))
return render_to_response('registsuccee.html',{'uf':uf},context_instance=RequestContext(req))
#
#def registfaild(req):
#    response = regist(req)
#    return response
#
#def registfaild1(req):
#    response = regist(req)
#    return response
def jsonclient(req):#获取json对象
try:
print("start json POST")
req = json.loads((req.body).decode())
print("get json succee")
return req
except:
import sys
info = "%s || %s" % (sys.exc_info()[0], sys.exc_info()[1])
print(info)
def datasave(request):#解板json对象并保存
info = 'Data log save success'
try:
if request.method == 'POST':
print("start json POST")
req = json.loads((request.body).decode())
user = req['user']
infoType = req['infoType']
name = req['name']
print(name)
print(infoType)
print(user)
except:
import sys
info = "%s || %s" % (sys.exc_info()[0], sys.exc_info()[1])
print(info)
dict['message']=info
return HttpResponse(json)
def getOtherUser(req,name):
userlogin=MyUser.objects.filter(username__exact=name)#检索当前登陆用户
print(userlogin)
print(userlogin.id)
user_list=MyUser.objects.all().values('username','id').exclude(id__in=userlogin.id)
# user_sum=MyUser.objects.all().values('username').count()
print(user_list)
# print(user_sum)
return user_list
def getAllUser(req):#获取已注册过的所有用户
user_list=MyUser.objects.all().values('username','id').order_by('id')
user_sum=MyUser.objects.all().values('username').count()
print(user_list)
print(user_sum)
return user_list
#登陆成功
def index(req):
username = req.COOKIES.get('username','')
user_list=getAllUser(req)#检索所有拥有username和id的用户对象
i=0
for list in user_list:
name=list.get('username').encode()
user_list[i].update({'username':name})
i=i+1
print('user_list == ',user_list)
#good=req.COOKIES.get('good','')
#print('good = ',good)
#user_list=getOtherUser(req,username)#检索当前登陆用户以外的所有用户
#user_first=user_list[0].username
user_first=username #暂时以登录人自己为默认接收人
#user_sum=MyUser.objects.all().values('username').count()#统计注册的用户数
#print(user_sum)
#datasave(req)
key_input=0
if req.method == 'POST':
print('index.username first= ',username)
json=jsonclient(req)#获取json对象
if json is not None:#判断是选择用户还是选择输入方式
user_ower = json['ownerID']#获取owerID
print('json is not none user_ower = ',user_ower)
#message=Message()#当选择消息接收者时创建消息对象
response = render_to_response('login_user.html' ,{'user_list':user_list,'username':username,'user_first':user_first},context_instance=RequestContext(req))
response.set_cookie('ownerID',user_ower,3600)
return response
else:
ownerID = req.COOKIES.get('ownerID','')#获取接收者ID
print('the message ownerID is',ownerID)
if ownerID:#如果有选择,则用选择者
user_ower=ownerID
else:#否则默认推送给发送者自己
Uower=MyUser.objects.get(username__exact=username)
user_ower=Uower.id
# message=Message.objects.get(id=messid)
#user_ower=message.ownerID
message=Message()#创建消息,注意就算第一次未选择消息接收者,也应该创建默认消息对象,默认接收ID为发送者自身
infoType_c=req.POST['submit']#提交信息的方式获取
infoType=int(infoType_c)
print('index:infotType=',infoType)
key_user=user_ower
key_input=infoType
print('key_user=',key_user)
print('key_input=',key_input)
user_push=MyUser.objects.get(username__exact=username)
print('username=',username)
print('user_push=',user_push)
message.infoType=infoType#推送消息的类型
message.pushID=user_push.id#推送者ID
message.ownerID= key_user#接收者的ID
message.pushTim=timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S")
message.isTop = 0 #置顶标志默认1
message.viewWeight = 1#阅读等级默认1
message.save()
print('message.id=',message.id)
messid=message.id
print('messid=',messid)
#由于post 的bug这里用html5前端来保存我们的messid
if key_input == 0:
print('please input text')
response = HttpResponseRedirect('/online/text/')
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
response.set_cookie('messid',messid,3600)
print('index:messid=',messid)
return response
elif key_input == 1:
print('please input video')
response = HttpResponseRedirect('/online/video/')
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
response.set_cookie('messid',messid,3600)
return response
else:
response = render_to_response('login_user.html' ,{'user_list':user_list,'username':username,'user_first':user_first,'messid':messid},context_instance=RequestContext(req))
print('error ~! just donot in this page')
response.set_cookie('messid',messid,3600)
return response
#return render_to_response('loginsuccee.html' ,{'user_list':json.dumps(user_list),'username':username,'user_first':user_first,'messid':messid},context_instance=RequestContext(req))
else:
return render_to_response('login_user.html' ,{'user_list': user_list,'user_first':user_first,'username':username},context_instance=RequestContext(req))
#退出
def logout(req):
response = HttpResponse('logout !!')
#清理cookie里保存username
response.delete_cookie('username')
response.delete_cookie('messid')
return response
#response = HttpResponse('logout !!')
#清理cookie里保存username
# response.delete_cookie('username')
# return response
def text(req):#输入文本处理
username = req.COOKIES.get('username','')
messid= req.COOKIES.get('messid','')
print('text:username=',username)
print('text:messid=',messid)
if req.method == 'POST':
#  json=jsonclient(req)#获取json对象
#  messid1 = json['messid']#获取owerID
#  print(messid1)
text = req.POST['text_input']
#if text is not None:
user=MyUser.objects.get(username__exact=username)
print('user.id=',user.id)
print('messid=',messid)
#userID=user.id
message=Message.objects.get(id=messid)
message.infoContent=text
print(username)
print('message.ownerID = ',message.ownerID)
print('message.pushID =',message.pushID)
print(message.infoContent)
#message.pushTim=timezone.localtime(timezone.now()).strftime("%Y-%m-%d %H:%M:%S")
message.save()
response = HttpResponseRedirect('/online/show/')
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
return response
# else:
#     return render_to_response('textfailed.html')
# print(dir(MyUser))
return render_to_response('text1.html',context_instance=RequestContext(req))
def video(req):#输入视频处理
username = req.COOKIES.get('username','')
messid= req.COOKIES.get('messid','')
print('video:username=',username)
print('video:messid=',messid)
if req.method == 'POST':
f = req.FILES.get('video')
if f is not None:
baseDir = os.path.dirname(os.path.abspath(__name__))
dir = os.path.join(baseDir,'static','save')
filedir=os.path.join(dir,f.name)
print('filedir = ',filedir)
timename=timezone.localtime(timezone.now()).strftime("%Y%m%d%H%M%S")
#filename = os.path.join(dir,f.name)
fname=os.path.splitext(f.name)
fsuffix=fname[1]
print('fsuffix =',fsuffix)
filename = os.path.join(dir,timename+fsuffix)#用当地时间编号代替手机发过来的任意文章名,以免重叠
print('filename =',filename)
fobj = open(filename,'wb')
for chrunk in f.chunks():
fobj.write(chrunk)
fobj.close()
message=Message.objects.get(id=messid)
message.filePath=filename
message.save()
response = HttpResponseRedirect('/online/show/')
#将username写入浏览器cookie,失效时间为3600
response.set_cookie('username',username,3600)
return response
else:
return render_to_response('camera_reinput.html')
else:
return render_to_response('camera.html')
def show(req):
username = req.COOKIES.get('username','')
messid = req.COOKIES.get('messid','')
message=Message.objects.get(id=messid)
print('message.infoContent',message.infoContent)
return render_to_response('save.html',{'text':text,'username':username,'message.infoContent':message.infoContent})
def delete():
MyUser.objects.filter().delete()

online/models.py

#coding:utf8
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin)
class MyUserManager(BaseUserManager):
#    def _create_user(self, username, email, password, **extra_fields):
def _create_user(self, username, password, **extra_fields):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('The given username must be set')
#        email = self.normalize_email(email)
#        user = self.model(username=username, email=email, **extra_fields)
user = self.model(username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
#    def create_user(self, username, email, password, **extra_fields):
def create_user(self, username, password, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('email',"")
extra_fields.setdefault('phone',"")
extra_fields.setdefault('haarValue',"")
extra_fields.setdefault('avatarImg',"")
#        extra_fields.setdefault('text',"")
#        extra_fields.setdefault('video',"")
#        extra_fields.setdefault('time',"")
return self._create_user(username, password, **extra_fields)
#        return self._create_user(username, email, password, **extra_fields)
#  def create_superuser(self, username, email, password, **extra_fields):
def create_superuser(self, username, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True')
#拓展user数据 by xiao
#get
#to
#message_flag
#text
#video
#time
#        extra_fields.setdefault('got',username)
#        extra_fields.setdefault('to',username)
#        extra_fields.setdefault('message_flag',"1")
#        extra_fields.setdefault('text',"")
#        extra_fields.setdefault('video',"")
#        extra_fields.setdefault('time',"")
return self._create_user(username, password, **extra_fields)
#        return self._create_user(username, email, password, **extra_fields)
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=254, unique=True, db_index=True)
email = models.CharField(max_length=254)
phone = models.CharField(max_length=254)
haarValue = models.CharField(max_length=254)
avatarImg = models.CharField(max_length=254)
#email = models.EmailField('email address', max_length=254)
#text=models.CharField(max_length=254, unique=True, db_index=True)
is_staff = models.BooleanField('staff status', default=False)
#    userID = models.IntegerField(default=1) #用户独有的ID
#    is_active = models.BooleanField('active', default=True)
#    got = models.CharField(max_length=254,default=username)
#    to = models.CharField(max_length=254,default=username)
#    message_flag = models.CharField(max_length=254, default=1)
#    text = models.CharField(max_length=254, default="")
#    video = models.CharField(max_length=254,default="")
#    time = models.CharField(max_length=254,default="")
USERNAME_FIELD = 'username'
#    REQUIRED_FIELDS = ['email']
objects = MyUserManager()
class Meta:
db_table = 'myuser'
#   def get_full_name(self):
#       return self.username
#   def get_short_name(self):
#      return self.username
#建立推送消息的模型
class Message(models.Model):
#    username = models.CharField(max_length=254) #消息推送者的名字
ownerID = models.IntegerField(default=1)
pushID = models.IntegerField(default=1)
infoType = models.IntegerField(default=0)
infoSubject = models.CharField(max_length=254)
infoContent = models.CharField(max_length=254)
filePath = models.CharField(max_length=1000)
pushTim = models.CharField(max_length=254)
infoValidityTime = models.CharField(max_length=254)
isTop = models.IntegerField(default=0)
viewWeight = models.IntegerField(default=1)
def __unicode__(self):
# 在Python3中使用 def __str__(self)
return self.name
class SystemStatus(models.Model): #实例化对象:online_message MMDB.updateSystemStatus('peopleInfront',-1,0,'no people in front')
statusName = models.CharField(max_length=30,default="peopleInfront")
statusValue = models.IntegerField(default=-1)
statusParam = models.IntegerField(default=0)
statusDiscirption = models.CharField(max_length=50,default="no people in front")
def __unicode__(self):
# 在Python3中使用 def __str__(self)
return self.name

三.演示效果图


图2 注册页面



图3 视频上传页面



图4 消息选择页面



图5 上传成功页面

四.例程分享:http://pan.baidu.com/share/link?shareid=3536829173&uk=1812979481

Dragonboard410c服务器系列六之用户交互系统相关推荐

  1. 读书笔记《了解用户系列六 | 群体用户心理》文/产品100(简书作者)

    <了解用户系列六 | 群体用户心理>文/产品100(简书作者) 原文链接:http://www.jianshu.com/p/41bfa2af83f1 例如在知乎发生的意见领袖抱团互相刷赞同 ...

  2. 图解:从单个服务器扩展到百万用户的系统

    作者 | Wolfram Hempel 翻译 | Join 你开发了一个网站(例如网上商店.社交网站或者其他任何东西),之后你把它发布到了网上,网站运行良好,每天有几百的访问量,能快速地相响应用户的请 ...

  3. 【极客学院出品】Cocos2d-X系列课程之六-用户交互事件处理方法

    2019独角兽企业重金招聘Python工程师标准>>> 时间过的真快,转眼又到了周五了.准备下班准备做什么? 改BUG.还是泡一大波美女? 不管你决定做什么,极客学院还是一如既往的推 ...

  4. 如何从单个服务器扩展到百万用户的系统?

    假如你开发了一个网站(例如网上商店.社交网站或者其他任何东西),之后你把它发布到了网上,网站运行良好,每天有几百的访问量,能快速地响应用户的请求. 但是有一天,不知道什么原因,你的网站出名了! 每分每 ...

  5. 服务器开机显示其他用户,win10系统开机显示其他用户怎么解决_网站服务器运行维护...

    win10如何打开恢复选项_网站服务器运行维护 win10打开恢复选项的方法是:1.首先打开设置界面:2.然后依次打开[更新和安全].[开发者选项]:3.接着勾选[开发人员模式],点击[显示设置],打 ...

  6. 面试系列六 之 用户行为数据分析

    关注我的公众号[宝哥大数据],更多干货等着你 1.1.数仓分层架构 分层优点:复杂问题简单化.清晰数据结构(方便管理).增加数据的复用性.隔离原始数据(解耦) 层级 名称 功能 压缩方式 存储格式 压 ...

  7. win系列服务器,windows服务器系列系统

    windows服务器系列系统 内容精选 换一换 本文以云服务器的操作系统为"Windows Server 2008 R2 Standard 64bit".磁盘容量为3 TB举例,提 ...

  8. 【CyberSecurityLearning 3】批处理、用户与组管理、服务器远程管理、破解Windows系统密码

    目录 一.批处理编写 1.1.批处理作用 1.2.如何创建批处理 1.3.批处理基本语法 1.3.1.@echo off 1.3.2.pause 1.3.3.title 1.3.4.echo. 1.3 ...

  9. 【Linux_Fedora_系统管理系列】_1_用户登录和系统初始配置

    发现一个问题,在FC14 的Firefox浏览器中,编辑和排版好的博文,在windows下用chrome或者猎豹浏览器打开后,排版就变得阅读 不是很容易里,而且经常不经意的断行.不知道园子的管理人员时 ...

最新文章

  1. Linux下rgmii接口,zynq7010 petalinux 2019.2 RGMII via EMIO 连接问题
  2. RocketMQ-初体验RocketMQ(01)_RocketMQ初体验
  3. linux命令格式,常用10个LINUX命令说明
  4. 数据数组赋值_嵌入式-数组赋值
  5. 5g的负面影响_设计系统的实施是否会对早期概念产生负面影响?
  6. apache shiro_Apache Shiro第3部分–密码学
  7. java 并发测试main方法_Java并发测试
  8. 面试官爱问的10大经典排序算法,20+张图来搞定
  9. C语言 memcpy函数(增加dst 从第一字节拷贝判断)的内部简单实现方式
  10. Spring AOP中的前置通知和后置通知详解
  11. tensorflow2.0 图像处理项目_UCOSIII移植——STM32F769I 图像处理能力评测之五
  12. Eclipse的自动编译和手动编译
  13. 网站颜色搭配[收藏]
  14. ong拼音汉字_汉语拼音ang-ong(教案)
  15. 给定一个字符串,去除整个字符串中重复的字符
  16. div水平(横向)/垂直排列
  17. 【Unity开发小技巧】Unity日志输出存储
  18. 数据分析需要掌握的知识(2)
  19. matlab中欠定方程组超定方程组_学会这些三元一次方程组的解法思路与运用,初中不再怕解方程...
  20. qt 侧边栏 Sidebar

热门文章

  1. 遍历JSONObject
  2. linux tomcat文件夹,linux 查看tomcat 在哪个文件夹
  3. 个人注册公司的利与弊
  4. 大学女生购衣之21条定律
  5. 响应式英文外贸拉丁舞芭蕾舞鞋类企业官网/英语外贸通用产品展示集团公司官网
  6. C语言数据类型——基本类型,构造类型,枚举类型,指针类型
  7. Codeforces Round #783 (Div. 2) ABC
  8. java cookie 无法删除不了_java中无法删除cookie之解决
  9. 校招|拿到腾讯、阿里、字节等10家互联网测试开发岗的offer
  10. 常用的关系型数据库有哪些?