__init__.py
python每个模块的包中都有一个__init__.py文件,有了这个文件,我们才能导入这个目录下的module。我们在导入一个包时,实际上是导入了它的__init__.py文件。
关于url(urls.py)
这个模块是在URL模式(简单的正则表达式)到python函数(我们的views)之间的一个简单映射。在python的正则表达式中,命名的正则表达式组的语法是(?P<name>pattren),其中,name是组的名字,pattern是需要符合的一些模式。下面针对该文件中用到的一些函数进行解析:
patterns(prefix, pattern_description, ...)
其中第一个参数是view的前缀,后面的参数都是元组。
url(regex, view, kwargs=None, name=None, prefix='')
其中kwargs允许我们给view的函数传递额外的参数,name参数的作用主要是可以在两个pattern都指向同一个view的时候,可以在模板的url中区分。
safe_reverse.py
这里面有很多reverse函数。先看reverse函数:
reverse(viewname[, urlconf=None, args=None, kwargs=None, current_app=None])
args与kwargs不能同时传入reverse函数中,current_app参数是提示当前在跑的这个view属于哪个application。这个函数可以把正则表达式反转为URLs。
views.py
render_to_response(template_name[, dictionary][, context_instance][, content_type][, dirs])
Django中的render_to_response()函数可以让我们一次性的利用给定的context dictionary加载入某个模板文件,渲染它,然后将此作为HttpResponse的返回。具体可参考:http://www.nowamagic.net/academy/detail/1318431
home:若还没有登录,则进入登录界面,否则进入活动列表界面。我们姑且把两种情况合称回到主页
@csrf_protect是一个装饰器,用于保护csrf攻击
wrap_activity_dict(activity)函数:将activity实例包装成一个dict,操作时,若活动已发布且订票已开始,则更改与票相关的一些量。
activity_list(request)函数:转到活动列表页面,参数是包装好的活动列表(每个列表是dict格式),和权限等级。
activity_checkin(request, actid)函数:处理登记id为actid的活动相关,若活动的截止时间比当前时间早,则提示Time out,并在异常的时候回到活动列表页面,否则进入checkin。
activity_checkin_post(request, actid)函数:为了简单起见,这里略去所有关于合法性判定及异常处理的说明,总体来说,这个函数是用来为一个用户申请一张票,先根据用户的学号分类处理,再分无票,有票,重复订票三种情况对相应的ticket实例的成员变量进行修改(比如票的状态),并且根据上述操作的情况,维护一个dict结构的变量rtnJSON,并在最后根据这个变量生成一个json作为response。
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None,encoding="utf-8", default=None, sort_keys=False, **kw)
序列化obj使之成为json格式的string
login(request):我们先看一下其中用到的一个函数:
authenticate(**credentials)
如果用户名,密码合法,则会返回一个User对象,否则返回None
所以该函数的作用就是如果用户输入的用户名和密码都是合法的,则利用auth.login(request, user)来登录,若不是合法的则分用户名存在和用户名不存在两种情况来给用户提示信息;不论成功与否,都会维护一个dict变量来记录这些状态。最终,这个变量会转换为json。
logout(request):利用auth.logout(request)函数进行登出操作。并返回到主页。
str_to_datetime(strg):这里只须弄清调用的函数即可:
datatime.strptime(date_string,format)
这个函数的作用是根据参数的字符串和解析该字符串的形式,返回一个datatime对象。
activity_create(activity):该函数的作用是创建一个活动,传入的是一个dict变量,随后根据不同的属性分类处理,仍旧为字符型的就直接复制,日期类型的就转换成datatime类,初始化活动的状态和剩余的票的数量,最终返回构造的新活动对象
activity_modify(activity):该函数做的是对活动信息做具体的修改(选择一些属性)。先根据当前活动是已保存但未发布还是已发布或已删除来决定该活动应该有哪些属性(就是keylist和timelist中的值),若当前活动是已发布的,则又会根据当前时间是处于什么时间点来决定有哪些属性。在确定了当前活动有哪些属性之后,开始按照属性列表来填那个Activity对象,并最终返回。
activity_delete(request):通过修改当前活动的状态来达到删除的效果
get_checked_tickets(activity):得到当前活动已经订出去的票的数量
activity_add(request):添加活动进入活动细节页面
activity_detail(request, actid):对于某个已有的活动,进入相应的活动细节页面,参数有描述具体活动的dict对象,和描述当前活动是否已发布的值
class DatetimeJsonEncoder(json.JSONEncoder):先看看用到的一个函数:
datetime.strftime(format):根据参数的格式指定,返回一个字符串表示datatime
若不是datatime的实例,则调用父类的default函数,它返回的是一个可序列化的对象。
activity_post(request):这个描述的是一个发布活动的过程。若请求中已经有了活动id,说明已经有了这个活动,我们只需调用activity_modify来修改即可;否则,就先检查一下要创建的活动在当前有效时间内是否有重名的,若有,则有状态记录并返回错误,若没有则会调用activity_create新建一个活动。这些都做完之后,要去检查微信菜单是否更新成功,若不成功会有相应记录。与上面的很多东西都相似,该函数中会维护一个dict变量,最终会转换成json
order_login(request):首先我们先看一个函数:
urllib.urlencode(query[, doseq]):
这个函数的作用是将map转换为string,结果字符串是一系列key= value对被’&’字符所分开。
urllib2.Request(url[,data][, headers][, origin_req_host][, unverifiable]):
这个类是URLrequest的一个抽象。
urllib2.urlopen(url[,data][, timeout]):
打开url,其中,url既可以是字符串,也可以是Request对象。
所以最终这个函数的作用就是将学生的学号,密码送到网络学堂进行认证,若认证成功,则在维护的dict变量中写入相关信息,否则,也是写上相应信息,最终转成json
order_list(request):该函数的作用是得到一个学生的已订票列表。做法是,先选出该学生订的所有票,针对每张票,得到该票所对应的活动的信息存进item对象中,最后每一个这样的item对象最终组成了orders。最后进到order_list.html页面,相关的参数是上面得到的orders和学生学号
print_ticket(request, unique_id):该函数的作用是打印某个票的活动信息。做法是,先得到这张特定的票,在得到票所对应的活动,最后导航至print_ticket.html页面
adjust_menu_view(request):过滤出当前还有效的(即活动的结束时间大于当前时间)且已经发布的活动,显示在adjust_menu.html中
custom_menu_get(request):该函数的作用是得到当前微信端的菜单,做法是,先得到父级按钮,再得到子菜单,自动清理一些过时的菜单,最后将得到的菜单转成数组
custom_menu_modify_post(request):该函数的作用是建立一个微信端的菜单
activity_export_stunum(request, actid):该函数的作用是将某一个活动的所有票的情况输出成一个xls,并且能够下载。所有票的情况是以一个表格的形式组织的。xlwt是一个第三方库,可以用来写Excel
模板
上面已经基本介绍完毕了关于后台管理的python文件,由于模板文件基本上比较相似,所以下面只是简单说一说模板的写法:
用{{}}包围的是变量
用{%%}包围的是块标签,可以有for,if等,含义和语言中的相似。
过滤器: eg. {{ship_date|date:"F j, Y"}} 把 ship_date 变量传递给过滤器并给 date 过滤器传递了一个参数 “F j, Y” , date 过滤器以给定参数的形式格式化日期