初探django-写一个小游戏charade
2017/7/5
目的:通过“根据tutorial学习的同时,尝试写一个猜英文单词的游戏页面(charade)”这样一个行为,来记录 django 开发过程中的经验细节。
说明:后续开发其他项目时,也有补充部分经验到这里。
一、准备环境1、建立项目[root@tvm01 ~]# mkdir /opt/charade[root@tvm01 ~]# cd /opt/charade[root@tvm01 charade]# django-admin startproject www[root@tvm01 charade]# cd www/2、备注1)此处为简单演示,未使用类似 virtualenv 这类配置,具体方法可以自行测试几次,很简单。2)使用的系统是 centos6.5x64,并编译安装了python2.7,如果是 centos7, 则默认已经是 python2.7 的版本二、操作概述1、项目设置[root@tvm01 www]# vim www/settings.py 设定时区,数据库等信息建立数据库和表:[root@tvm01 www]# python manage.py migrate2、配置app1)创建app[root@tvm01 www]# django-admin startapp charade2)设定urls:[root@tvm01 www]# vim www/urls.py[root@tvm01 www]# vim charade/urls.py 3)模型[root@tvm01 www]# vim charade/models.py通知django有数据变更[root@tvm01 www]# python manage.py makemigrations charadeMigrations for 'charade': 0001_initial.py: - Create model GameScoreBoard - Create model GameTemporaryTable - Create model Vocabulary 检查要变更的sql: [root@tvm01 www]# python manage.py sqlmigrate charade 0001执行变更:[root@tvm01 www]# python manage.py migrate这个是 migrate 所有的 apps也可以指定某个 app 来执行 migrate 操作:[root@tvm01 www]# python manage.py migrate charade 0001查看执行过的变更:[root@tvm01 www]# python manage.py showmigrations charadecharade [X] 0001_initial4)注册模型到后台[root@tvm01 www]# vim charade/admin.py5)视图[root@tvm01 www]# vim charade/views.py 6)模版模版和静态文件的目录[root@tvm01 www]# mkdir charade/templates/charade -p[root@tvm01 www]# mkdir charade/static/charade/p_w_picpaths -p[root@tvm01 www]# vim charade/templates/charade/index.html[root@tvm01 www]# vim charade/templates/charade/detail.html3、运行服务[root@tvm01 www]# python manage.py runserver 0.0.0.0:80 4、创建管理员[root@tvm01 www]# python manage.py createsuperuser5、测试[root@tvm01 www]# python manage.py test charade6、shell[root@tvm01 www]# python manage.py shell7、流程startproject(www) -> startapp(charade) -> settings/urls(www) -> urls/models(charade) -> views/admin(charade) -> templates/static(charade)三、技巧1、在模版的一个循环中,根据行数来使用不同的css class注意 cycle 的用法{% for o in some_list %}... {% endfor %}2、调整后台的模版1)找到django的源码文件路径[root@tvm01 www]# python -c "import syssys.path = sys.path[1:]import djangoprint(django.__path__)"['/usr/local/lib/python2.7/site-packages/django']2)创建目录,拷贝并修改模版[root@tvm01 mysite]# mkdir templates/admin -p[root@tvm01 mysite]# cp /usr/local/lib/python2.7/site-packages/django/contrib/admin/templates/admin/base_site.html templates/admin/base_site.html3)配置 www/settings.pyTEMPLATES = [ { (略) 'DIRS': [os.path.join(BASE_DIR, 'templates'),], (略) },]3、支持中文参考:https://docs.djangoproject.com/en/1.9/ref/unicode/#general-string-handlinghttps://docs.djangoproject.com/en/1.9/ref/unicode/#models1)针对 string解决办法:from __future__ import unicode_literals原因:a)Python 2 legacy:my_string = "This is a bytestring"my_unicode = u"This is an Unicode string"b)Python 2 with unicode literals or Python 3:from __future__ import unicode_literalsmy_string = b"This is a bytestring"my_unicode = "This is an Unicode string"2)针对 model解决办法:from django.utils.encoding import python_2_unicode_compatible原因:选择 __str__() 还是 __unicode__()如果使用的是 Python 3 的环境,则使用 __str__() 而不是 __unicode__()如果要兼容 Python 2 的环境,请使用修饰符 python_2_unicode_compatible().3)通常情况下,异常内容包括UnicodeEncodeErrorUnicodeDecodeError 4)使用示例(针对 model class 使用修饰符,直接返回中文字符,而不会报错)# coding: utf-8from __future__ import unicode_literalsfrom django.utils.encoding import python_2_unicode_compatible在每个 model class 前面,修饰一下:@python_2_unicode_compatibleclass Choice(models.Model): question = models.ForeignKey(Question) choice_text = models.CharField('选项', max_length=200) votes = models.IntegerField('票数', default=0) def __str__(self): # __unicode__ on Python 2 return self.choice_text 4、使用用户认证系统组件1)创建一个app[root@tvm01 www]# django-admin startapp accounts2)配置 www/settings.py[root@tvm01 www]# vim www/settings.pyINSTALLED_APPS = [ (略) 'accounts', (略)]3)配置 www/urls.py[root@tvm01 www]# vim www/urls.pyurlpatterns = [ (略) url(r'^accounts/', include('accounts.urls')), (略)]4)配置 accounts/urls.py[root@tvm01 www]# vim accounts/urls.pyfrom django.conf.urls import urlfrom django.contrib.auth import views as auth_viewsapp_name = 'accounts'urlpatterns = [ #################################### accounts # url(r'^login/$', auth_views.login, name='login'), url(r'^logout/$', auth_views.logout, {'next_page': '/'}, name='logout'),]5)配置模版本次示例的模版是自己照着django官网auth文档中“All authentication views”这一块提到的模版写的,其实,也可以用django的form来生成模版内容,详情请参考github源码的示例[root@tvm01 www]# mkdir accounts/templates/accounts -p[root@tvm01 www]# cat accounts/templates/accounts/login.html {% extends "charade/base.html" %}{% load staticfiles %}{% block titles %}Login{% endblock %}{% block js4this %}