python+Django创建购物网站(二)
一、Django模板语言,Django Template Language (DTL)
模板语言内容比较多,具体用到哪块,再去学习相应的模块就可以了。
学习链接:http://www.liujiangblog.com/course/django/145
官网(英文):https://docs.djangoproject.com/en/2.1/ref/templates/language/
模板语言主要包括以下几种形式:
1、变量
{{ ... }} 输出Python表达式结果。
2、过滤器
{{ 变量 | 过滤器 }}
https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#built-in-filter-reference
<html>
<body>
<h3>name变量:{{ name }}</h3>
<h3>name单词首字母大写:{{ name|title }}</h3>
<h3>name小写:{{ name|lower }}</h3>
<h3>name大写:{{ name|upper }}</h3>
<h3>name字符串长度:{{ name|length }}</h3>
<h3>获得第一个元素:{{ message|first }}</h3>
<h3>获得最后一个元素:{{ message|last }}</h3>
<h3>将元素连接起来:{{ message|join:" " }}</h3>
<h3>截取前两个单词:{{ message|first|truncatewords:2 }}</h3>
<h3>日期格式化:{{ date|date:"Y-m-d" }}</h3>
<h3>数字格式化:{{ number|floatformat:2 }}</h3>
</body>
</html>
3、模板标签
标签可以执行一些操作语句,如if、for和模板继承等。
{% ... %}
例如:
判断结构:
{% if 条件表达式 %}
...
{% endif %}
循环结构:
{% for item in 序列 %}
...
{% endfor %}
4、模板继承
定义基础模板base.html:
<div id="content">
{% block body %}
{% endblock %}
</div>
继承基础模板login.html:
{% extends "base.html" %}
...
{% block body %}
<table width="40%" border="0">
...
</table>
{% endblock %}
二、访问静态文件
Web应用有一些静态文件,如:图片文件、CSS文件和Javascript文件等。
配置步骤:
1、确认settings.py中INSTALLED_APPS否安装了django.contrib.staticfiles。
2、确认settings.py中STATIC_URL的配置:
STATIC_URL = '/static/'
3、在books下面创建static文件夹,然后把静态文件复制到static文件夹中。
4、修改模板文件
{% load static %}
...
<link rel="stylesheet" type="text/css" href="{% static 'css/book.css' %}">
...
<img src="{% static 'images/book_img2.jpg' %}" width="20px" height="20px">
三、HttpRequest对象
HTTP协议有请求和应答过程,客户端提交的数据被封装在请求对象中。Flask提供了请求对象HttpRequest,HttpRequest的属性:
method:返回当前请求方法。
POST:返回HTTP POST请求参数,它是QueryDict字典类型数据,包含了客户端提交表单数据,数据键是客户端控件名,数据值是客户端控件的值。
GET:返回HTTP GET请求参数,它是QueryDict字典类型数据。是客户端提交参数,参数是跟在URL的?后面的内容,http://127.0.0.1:8000/books/login/?userid=tony&userpwd=12345
COOKIES:是客户端Cookie对象,是字典类型。
session:是客户端HTTP Session对象,是字典类型。
FILES:与上传文件相关数据。
四、HttpResponse响应对象。
HTTP协议有请求和应答过程,服务器端返回的数据被封装在应答对象中。 HTTP协议应答包含了返回给客户端的字符串、状态码(默认是200)。
HttpResponse应答对象主要属性:
content:返回给客户端内容,默认是字符串。
charset:指定返回给客户端内容的字符集,默认是UTF-8。
status_code:响应HTTP状态代码。
reason_phrase:响应HTTP状态原因。
HttpResponse应答对象主要方法:
构造方法HttpResponse(content='', content_type=None, status=200, reason=None, charset=None):content_type是设置应答的MIME类型,用于填充HTTP Content-Type标头。默认是text/html; charset=utf-8
set_cookie(key, value=''):设置Cookies。
delete_cookie(key,path ='/',domain = None):删除Cookies。
示例:
def hello(request):
response = HttpResponse("<h3>Hello, world. </h3>", charset='gbk')
response.charset = 'gbk' #'utf-8'
response.write('<h3>世界你好。</h3>')
return response
五、Cookie对象
Cookie是存储在客户端计算机上的数据,不同的浏览器有自己的存储目录,使用Cookie的目的是记住和跟踪与客户使用相关的数据。
1、设置Cookie,使用HttpResponse的set_cookie函数:
set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None)
key:Cookie键。
value:Cookie值。
expires:设置Cookie超时时间,HTTP/1.0中定义的。设置的"Wdy, DD-Mon-YY HH:MM:SS GMT"字符串,或datetime.datetime时间对象。
max_age:设置Cookie超时时间,单位是秒,HTTP/1.1中定义的。
domain:设置Cookie域,如果你想设置一个跨域的Cookie,可以设置域名。
设置示例:
def index(request):
response = HttpResponse("<h3>设置Cookies</h3>")
# 设置Cookies
response.set_cookie('userid', 'tony')
return response
使用expires设置超时时间:
timeoutdate = datetime.today() + timedelta(days=10)
response.set_cookie('userid', 'tony', expires=timeoutdate)
使用max_age设置超时时间:
response.set_cookie('userid', 'tony', max_age=60)
2、获取Cookie,使用HttpRequest的COOKIES属性返回Cookie对象,再通过Cookie键获得:
def hello(request):
# 取出Cookies
name = request.COOKIES.get('userid')
response = HttpResponse("<h3>取出Cookies</h3>")
response.write('<h3>Cookies中userid:' + str(name) + '</h3>')
return response
六、Session对象
Session与Cookie不同,Session是存储在服务器端,服务器为每一个客户端分配一个Session ID,当浏览器关闭或Session操作超时,Session就会失效。Session往往用来存储用户的登录信息。Session数据结构与Cookie一样都是字典结构。
在Django中Session的数据是放到数据库中的,因此需要保证Session表已经创建,如果没有需要执行如下指令:
python manage.py migrate
否则发生错误:{OperationalError}no such table: django_session
# 设置关闭浏览器Session过期
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
1、设置Session:
def login(request):
if request.method == 'POST':
userid = request.POST['userid']
request.session['userid'] = userid
return render(request, 'result.html')
2、获取Session:
<h3>存储在Session中的userid数据:{{ request.session.userid }}</h3>
注意:在模板中取Session数据,不能通过方法和下标(session['userid'])方法。方法Session的表达式是session.key,例如:(session.userid)。
3、删除Session:
def logout(request):
if request.session.has_key('userid'):
del request.session['userid']
return render(request, 'result.html')