笔记一 10课
1.视图中的变量在html中展示 A.在视图中定义youPorn变量以及info_data字典 def index(request): name_info = { 'name':'SanJin', 'age': 21, 'hobbie': "show", 'job': "stripper" } #return render(request,'index.html',{'your':"gaoguodeng learn python"}) return render(request, 'index.html', { 'youPorn': "SanJin Is on the show now!", 'info_data': name_info }) B. 在html文件中引用。双大括号里面带变量名即可,如: `info_data` `youPorn` 2.django 的if 判断 {% if k == "job" %}
笔记二 11课
一.添加静态资源目录 STATIC_URL = '/static/' STATICFILES_DIRS =[ os.path.join(BASE_DIR,'statics'), ] 二.学习django request 对象 http://python.usyiyi.cn/django/ref/request-response.html 三.动态获取url匹配 1.在urls.py中的url匹配条目中加入name='xxx' 变量 如下面的首页,在后面加: name='index' urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', views.index,name='index'), url(r'^host/$', views.host, name='host'), url(r'^asset/$', views.asset, name='asset'), url(r'^audit/$', views.audit, name='audit'), ] 2.在对应的html文件中直接应用url条目的变量即可。 index.html文件中的用法,如下上面的首页,本应该写为:
host
{% endblock %} 2.django获取访问的路径 {{ request.path }} 3.切换导航栏高亮 4.url 别名url name 的值不变,无论前面的正则如何改变,在页面中调用url也不用改 urlpatterns = [ url(r'^admin/', include(admin.site.urls)), url(r'^$', views.index), url(r'^host/$', views.host,name='host'), url(r'^asset/$', views.asset,name='asset'), url(r'^audit/$', views.audit,name='audit'), ] 5. 模型class ---> 表 字段(属性) ---> 列 方法 ---> 操作数据库 6.重写django的用户 from django.contrib.auth.models import User ##导入django自带的用户表 class UserProfile(models.Model): user = models.OneToOneField(User) ## 这里用的是一对一关心,把这里的用户关联到django自带的用户 name = models.CharField(max_length=64,unique=True) ##下面的就是扩展的字段 host_groups = models.ManyToManyField('HostGroup',blank=True,null=True) ##用户可以不属于任何一个组 hosts = models.ManyToManyField('Host',blank=True,null=True) ##用户可以不属于任何一个主机 def __unicode__(self): return self.name 7.django使用mysql数据库 第一步:在mysql数据库中数据对于的库: create database django01 character set utf8; 第二步:在setting 配置文件中引用这个数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 设置为mysql数据库 'NAME': 'django01', # mysql数据库名 'USER': 'root', # mysql用户名,留空则默认为当前linux用户名 'PASSWORD': 'wdzj@2015', # mysql密码 'HOST': '140.206.51.154', # 留空默认为localhost 'PORT': '1205', # 留空默认为3306端口 } } 现在Django知道要包含polls应用。 让我们运行另外一个命令: python manage.py makemigrations polls python manage.py sqlmigrate polls 0001 运行python manage.py makemigrations ,为这些修改创建迁移文件 运行python manage.py migrate ,将这些改变更新到数据库中。 desc app01_host; #查看app01_host 的表结构 show create table app01_host; ##查看创建app01_host表语句 ########### 8.相关表说名 mysql> show tables; +-------------------------------+ | Tables_in_django1 | +-------------------------------+ | app01_host | | app01_host_groups | //这个表是app01_host和app01_hostgroup之间的关联表 | app01_hostgroup | | app01_idc | | app01_userprofile | | app01_userprofile_host_groups | // 这个也是关联变 | app01_userprofile_hosts | | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +-------------------------------+ 17 rows in set (0.01 sec) 上面的表中,app01是应用的名称,在models中的每个类都会生成一个相应的表,表名就是 应用名称加上_类名,如上面的app01_host表,以及一些关联表,如app01_host_groups django表之间的关联就是通过中间的一个关联表进行关联的 9.把models.py中创建的表,在web中显示出来 在app01/admin.py 中增加下面内容 import models from django.contrib import admin admin.site.register(models.Host) admin.site.register(models.HostGroup) admin.site.register(models.IDC) admin.site.register(models.UserProfile) admin.site.register(models.IDC) 10.进入django的管理后台 http://0.0.0.0:8000/admin/ 11.创建一个django后台超级用户 python manage.py createsuperuser Lvnian:s10day11_1 root# python manage.py createsuperuser System check identified some issues: WARNINGS: app01.UserProfile.host_groups: (fields.W340) null has no effect on ManyToManyField. app01.UserProfile.hosts: (fields.W340) null has no effect on ManyToManyField. Username (leave blank to use 'root'): root Email address: Password: Password (again): Superuser created successfully. Lvnian:s10day11_1 root# 9. def __unicode__(self): return self.name 10.跨越{% csrf_token %} 当你用post方法提交表单内容时,需要{% csrf_token %}这个-
{% for group in request.user.userprofile.host_groups.select_related %}
- {{ group.name }}
- {{ host.hostname }} --->{{ host.ip_addr }} {% endfor %}
-
{% for host in group.host_set.select_related %}
笔记三 12 课
1,应用django的用户 from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User) 2.自关联需要家 related_name='xxx' parent_comment = models.ForeignKey('Comment',blank=True,null=True,related_name='pid') 3.应用表在admin页面 在 app/admin.py 中编写下面内容 from django.contrib import admin import models admin.site.register(models.Article) admin.site.register(models.Gategory) admin.site.register(models.ThumbUp) admin.site.register(models.Comment) admin.site.register(models.UserProfile) admin.site.register(models.UserGroups) 4.创建超级用户 Type 'manage.py help' for usage. Lvnian:s10day12bbs root# python manage.py createsuperuser Username (leave blank to use 'root'): Email address: Password: Password (again): Superuser created successfully. Lvnian:s10day12bbs root# 5.获取文章 ######views.py def index(request): articles = models.Article.objects.all().order_by('-publish_date') return render(request,'index.html',{ 'articles': articles }) ######index.html {% for article in articles %} {{ article }}第五步,这个免费的编辑器的功能有点少,可以点击Advanced选择其他 免费的插件 也就说把上面第三部的内容换为下面的内容 第五部。这个编辑器上存到数据库的内容是html内容 10.把编辑器的内容上传到数据库 11.认证用户: 第一步: login.html 文件如下: {% extends 'index.html' %} {% block container %}
{% endfor %} 6.boostrap 中让div换行,用row7.微信等小图标到 font-awesome中找 http://fontawesome.dashgame.com/ 如微信的图标就直接应用: 但是是需要下下载font-awesomes 的css样式 并且应用它 8. 二次渲染,safe可以解析html标签: {{ article.content |safe}} 9.编辑器 参考文档:http://archive.tinymce.com/wiki.php/Installation 第一步:下载tinymce编辑器,在本程序中已经下载好,在/static/plugins/tinymce目录中 第二步:在html文件中应用这个js问题,如下: 第三步: 第四步:在你需要的添加编辑起的地方应用下面代码
{{ login_err }}
... {% endfor %}
{% if contacts.has_previous %} ##判断后端传来的页数,有没有上一页
previous
{% endif %}
Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
{% if contacts.has_next %} ##判断后端传来的页数,有没有下一页
next
{% endif %} ### ?page ,加上'?'问号。 就是一个get方法。
###################################
###################################
################################### 前端处理,用bootstrap 实现, 作业:线上分页中的前后几页,而不是下面的全部页面都显示
13day聊天室笔记
1.生产者,消费者模型 django 的自带 Q 用户和用户聊天 :建立一个队列,在他们聊天的时候才建立 用户在群组聊天: 用户和群组的每个在线的用户都建立一个队列。 定时到服务端去消息,设置多长时间去取消息,就有多就的延迟。 客户端可以设置一直get固定的时长,时间一过,服务器就断开。服务器断开之后,客户端马上连接,再get固定时长,不断重复 >>> a.get(timeout=5) ##如果没有get到数据就保存get连接5秒,5秒后断开 2.消息队列: >>> import Queue >>> a = Queue.Queue() >>> a>>> a.put(123) >>> a.put(234) >>> a.get > >>> a.get() 123 >>> a.get() 234 >>> a.qsize() 0 >>> a.put(123) >>> a.qsize() 1 >>> a.put(234) >>> a.qsize() 2 >>> >>> a.get(timeout=5) ##如果没有get到数据就保存get连接5秒,5秒后断开 Traceback (most recent call last): File " ", line 1, in File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/Queue.py", line 176, in get raise Empty Queue.Empty >>> 3 建一个新的app Lvnian:s10day12bbs root# python manage.py startapp web_qq Lvnian:s10day12bbs root# ls .idea 111.jpeg bbs manage.py statics web_qq ???????????????.txt 1.jpg 111_y4xE6o8.jpeg db.sqlite3 s10day12bbs templates ??????BBS Lvnian:s10day12bbs root# 4.本这个web_qq关联起来 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'bbs', 'web_qq', ) 5.设置models 6.生产相关数据库表 Lvnian:s10day12bbs root# python manage.py makemigrations Migrations for 'web_qq': 0001_initial.py: - Create model QQGroup Migrations for 'bbs': 0004_userprofile_friends.py: - Add field friends to userprofile Lvnian:s10day12bbs root# python manage.py migrate Operations to perform: Synchronize unmigrated apps: staticfiles, messages Apply all migrations: sessions, admin, auth, contenttypes, web_qq, bbs Synchronizing apps without migrations: Creating tables... Running deferred SQL... Installing custom SQL... Running migrations: Rendering model states... DONE Applying bbs.0004_userprofile_friends... OK Applying web_qq.0001_initial... OK Lvnian:s10day12bbs root# 7.创建聊天室web页面,和相关的url 第一步:把web_qq的相关url分离出来 1.在主urls中添加下面内容 from web_qq import urls as char_urls url(r'^chat/', include(char_urls)), 2.在web_qq 中添加urls文件,写下面的文件 from django.conf.urls import url import views urlpatterns = [ url(r'^$', views.dashboard, name='chat'), ] 第二步:添加相应的views from django.shortcuts import render def dashboard(request): return render(request,'web_qq/bashboard.html') 第三步:添加相应的bashboard.html 8.boostrap 聊天窗模版: http://v3.bootcss.com/javascript/#tabs 9.boostrap 聊天窗中的联系人模版:http://v3.bootcss.com/components/#list-group 10.循环取用户: {% for contact in request.user.userprofile.friends.select_related %} {{ contact.name }} {% endfor %} 11. 点击那个用户,那个用户就高亮的javascript {% block bottom-js %} {% endblock %} 12.自定义属性 {{ contact.name }} 上面的contact-id="{{ contact.id }}"是自定义属性 13.点击那个用户,那个用户就高亮,并且聊天窗口切换到对于的用户聊天框中 {% for contact in request.user.userprofile.friends.select_related %} {{ contact.name }} {% endfor %}#################################### 14.敲回车键就发送消息到聊天窗口 function AddSentMagIntoBox(msg_text) { var msg_div = "" + "" + "{{ request.user.userprofile.name }}" + "" + "" + new Date().toLocaleDateString() + "" + "" ; $(".dialog-box-content").append(msg_div); $(".dialog-box-content").animate({ // 配合css中的/* overflow: auto; 消息框满屏情况下不要把消息谈到窗外 */ 。让消息在满屏的情况下,显示最新的消息在最下面 scrollTop : $(".dialog-box-content")[0].scrollHeight},300) } 15.发送消息到后台 function SendMsg(msg) { // 把我是谁,我发送的消息,以及发送消息的类型 发送到后台 var msq_dic = { // 要发送的内容 'from_id':"{{ request.user.userprofile.id }}", 'to_id':$(".dialog-box-head span").attr("contact-id"), 'contact-type':$(".dialog-box-head span").attr("contact-type"), 'msg':msg, } // POST 发送 必须要待token才可以发送,不然出现403错误, JSON.stringify(msq_dic) 是把上面的msq_dic转化为json格式后发送到啊后台 //$.post("{% url 'char_send_msg' %}",{'data':msq_dic,'csrfmiddlewaretoken':$("input[name='csrfmiddlewaretoken']").val()},function(collback){ $.post("{% url 'char_send_msg' %}",{'data':JSON.stringify(msq_dic),'csrfmiddlewaretoken':$("input[name='csrfmiddlewaretoken']").val()},function(collback){ console.log(collback); }); //end post } // {% url 'char_send_msg' %} 这个url 对于的就就说下面的内容。 def send_msg(request): print request.POST #print request.POST.get('data[msg]') ## 获取还没转为json格式的单个数据 data = request.POST.get('data') ## 获取前台传过来的所有数据 data = json.loads(data) data['date'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M%S") to_id = data.get('to_id') #print to_id contact_type = data.get('contact-type') user_obj = models.bbs_models.UserProfile.objects.get(id=to_id) print user_obj if contact_type == 'single': if not globals_msg_dic.has_key(to_id): globals_msg_dic[to_id] = utils.Char() ## 初始化数据 globals_msg_dic[to_id].msq_queue.put(data) print '\033[31;1, Push msg [%s] into user [%s] queue ' %(data['msg'],user_obj.name) return HttpResponse('ok ') ################################# ################################# ################################# $(document).ready(function () { RefreshMsgs = setInterval(function () { GetNewMsg(); },3000) $("#content-list a").click(function () { $(this).addClass("active"); $(this).siblings().removeClass("active"); SwitchChatBox(this); /* 定义一个切换聊天框函数 */ }) }); ################ function GetNewMsg() { $.get("{% url 'get_new_msg' %}",{'uid':"{{ request.user.userprofile.id }}"},function(callback){ console.log(callback); $.each(callback,function (index,msg) { pass })//end each }); //end get } 7.徽章" + msg_text + "
" + "8.页面切换,内容显示当前用户的,不显示老用户内容。 function SessionHandle(contact_id,contact_type,action) { if(action == 'dump'){//如果是dump,那就是保存当前聊天页面 var current_dialog_content = $(".dialog-box-content").html(); all_dialog_sessions[contact_type][contact_id] = current_dialog_content //console.log(all_dialog_sessions[contact_type][contact_id]) }else if(action == 'load'){// 如果是load,就是把切换后的,也就是指定的contact_id 的聊天记录加载出来 var new_dialog_content = '' if(all_dialog_sessions[contact_type].hasOwnProperty(contact_id)){ new_dialog_content = all_dialog_sessions[contact_type][contact_id] } return new_dialog_content }// if } // func 9. function SwitchChatBox(ele){ var current_uid = $(ele).attr("contact-id") var current_dialog_type = $(ele).attr("contact-type"); var current_contact_name = $(ele).text(); var old_session_id = $(".dialog-box-head span").attr("contact-id"); var old_session_type = $(".dialog-box-head span").attr("contact-type"); SessionHandle(old_session_id,old_session_type,'dump') var current_dialog_content = SessionHandle(current_uid,current_dialog_type,'load') $(".dialog-box-content").html(current_dialog_content) // 注意后面还要加载新接受的内容 var dialog_head_html = "" + current_contact_name + "" ; $(".dialog-box-head").html(dialog_head_html) $(".dialog-box-content").animate({ // 配合css中的/* overflow: auto; 消息框满屏自动滚动到最底 */ 。让消息在满屏的情况下,显示最新的消息在最下面 scrollTop : $(".dialog-box-content")[0].scrollHeight},500); } //同时把这条消息保存到全局变量中 var msg_sender_name = $("#content-list a[contact-id='"+ msg.from_id +"']").text(); var msg_div= "
- 14 Cras justo odio
" + "" + msg_sender_name + "" + "" + msg.date + "" + "" + "" + msg.msg + "" var old_session_content = SessionHandle(msg.from_id,msg.contact_type,'load'); var new_session_content = old_session_content +msg_div ; all_dialog_sessions[msg.contact_type][msg.from_id] = new_session_content