djang的模板和session
一、创建一个app目录
|
1
|
在models.py只能类进行进行创建表 |
1 class Foo: 2 xx= 字段(数据库数据类型) 3 字段类型 4 字符串 5 EmailField(CharField): 6 IPAddressField(Field) 7 URLField(CharField) 8 SlugField(CharField) 9 UUIDField(Field) 10 FilePathField(Field) 11 FileField(Field) 12 ImageField(FileField) 13 CommaSeparatedIntegerField(CharField) 14 时间类: 15 models.DateTimeField(null=True) 16 数字: 17 num = models.IntegerField() 18 num = models.FloatField() 19 mum = models.DecimalField(max_digits=30,decimal_places=10) 20 枚举(Django): 21 color_list = ( 22 (1,'黑色'), 23 (2,'白色'), 24 (3,'蓝色') 25 ) 26 color = models.IntegerField(choices=color_list)
二、字段参数
|
1
|
字段参数 |
1 字段参数: 2 null=True, 允许为空 3 default='1111', 设置默认值 4 db_index=True, 设置索引 5 unique=True 设置唯一索引
三、创建索引
|
1
2
3
4
5
6
7
8
9
|
创建索引class Meta: # unique_together = ( # ('email','ctime'), 创建联合唯一索引 # ) # index_together = ( # ('email','ctime'), 创建联合索引 # ) |
四、DjangoAdmin提供的参数
|
1
2
3
4
5
6
|
DjangoAdmin提供的参数: verbose_name Admin中显示的字段名称 blank Admin中是否允许用户输入为空 editable Admin中是否可以编辑 help_text Admin中该字段的提示信息 choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1) |
|
1
|
自定义错误类型 |
1 error_messages 自定义错误信息(字典类型),从而定制想要显示的错误信息;
2 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
3 如:{'null': "不能为空.", 'invalid': '格式错误'}
4
5 有些是不能进行自定义
|
1
|
validators 自定义错误验证(列表类型),从而定制想要的验证规则 |
1 validators 自定义错误验证(列表类型),从而定制想要的验证规则
2 from django.core.validators import RegexValidator
3 from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
4 MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
5 如:
6 test = models.CharField(
7 max_length=32,
8 error_messages={
9 'c1': '优先错信息1',
10 'c2': '优先错信息2',
11 'c3': '优先错信息3',
12 },
13 validators=[
14 RegexValidator(regex='root_\d+', message='错误了', code='c1'),
15 RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
16 EmailValidator(message='又错误了', code='c3'), ]
17
18 a. 直接通过(因为数据库可以不添加数据)
19 models.Userinfo.objects.create(....)
20 -- ModelForm
21
22 b. 影响Django自带的管理工具admin
五、模板
1、模版的执行
模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。
1 def current_datetime(request): 2 now = datetime.datetime.now() 3 html = "<html><body>It is now %s.</body></html>" % now 4 return HttpResponse(html)
1 from django import template
2 t = template.Template('My name is {{ name }}.')
3 c = template.Context({'name': 'Adrian'})
4 print t.render(c)
1 import datetime
2 from django import template
3 import DjangoDemo.settings
4
5 now = datetime.datetime.now()
6 fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
7 t = template.Template(fp.read())
8 fp.close()
9 html = t.render(template.Context({'current_date': now}))
10 return HttpResponse(html
1 from django.template.loader import get_template
2 from django.template import Context
3 from django.http import HttpResponse
4 import datetime
5
6 def current_datetime(request):
7 now = datetime.datetime.now()
8 t = get_template('current_datetime.html')
9 html = t.render(Context({'current_date': now}))
10 return HttpResponse(html)
1 return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))
2、模版语言
模板中也有自己的语言,该语言可以实现数据展示
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{{ item }}{% for item in item_list %} <a>{{ item }}</a> {% endfor %} forloop.counter forloop.first forloop.last{% if ordered_warranty %} {% else %} {% endif %}母板:{% block title %}{% endblock %}子板:{% extends "base.html" %} {% block title %}{% endblock %}帮助方法:{{ item.event_start|date:"Y-m-d H:i:s"}}{{ bio|truncatewords:"30" }}{{ my_list|first|upper }}{{ name|lower }} |
3、自定义simple_tag
a、在app中创建templatetags模块
b、创建任意 .py 文件,如:xx.py
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/usr/bin/env python#coding:utf-8from django import templatefrom django.utils.safestring import mark_safe register = template.Library() @register.simple_tagdef my_simple_time(v1,v2,v3): return v1 + v2 + v3 @register.simple_tagdef my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result) |
c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
|
1
|
{% load xx %} |
d、使用simple_tag
|
1
2
|
{% my_simple_time 1 2 3%}{% my_input 'id_username' 'hide'%} |
e、在settings中配置当前app,不然django无法找到自定义的simple_tag
|
1
2
3
4
5
6
7
8
9
|
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01',) |
六、Session
|
1
2
3
4
|
Session是什么?Session 是保存在服务端的数据Cookie是什么?Cookie是保存在客户端浏览器上的键值对 |
Session个人理解
|
1
2
3
4
5
|
个人Session理解说明:Session就是在存再服务端的数据,每次有人来访问网页Session会检测用户是否带Session发送的随机字符串,如果有随机字符串Session就自己会查看自己以字典形式保存在内存的数据,字典键就是Session生成的随机字符串,字典的值就是用户的信息。整体总结:Session是依赖于Cookie的一种会话保持,Session会向第一次成功访问的用户发送一个随机的字符串,以便以后用户登录可以准确的定位到用户是谁,用户的相关信息。需要注意一点,每个用户之间都是独立的字典,不会出现用户信息混乱状况,使用Session的好处,用户查看不到敏感信息 |
|
1
2
3
4
5
6
|
个人Cookie理解说明:Cookie是存在客户端浏览器上的键值对Cookie的可以用于用户登录验证,投票整体总结:Cookie会向第一次成功登陆页面的用户发送一个键值对,如果下次登陆服务端会检测用户是否携带Cookie如果携带就可以直接进行访问不需要再进用户验证。Cookie可以设置过期时间 和哪些用户可以进行访问 |
Session 保存在服务端的数据(本质是键值对)
配置文件中可以指定存储位置
数据库 Session
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) b. 使用 def index(request): # 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key") request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 |
缓存Session
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 b. 使用 同上 |
文件Session
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 SESSION_COOKIE_SECURE = False # 是否Https传输cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 b. 使用 同上 |
缓存+数据库Session
|
1
2
3
4
5
6
7
8
9
10
11
12
|
数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 b. 使用 同上缓冲+数据库 先是去数据库中查找,没有就去数据库中查找 |
Cookie 中存放Session
|
1
2
3
4
5
6
7
8
9
10
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 b. 使用 同上这样的存放方式 相当于没有使用Session |
Session 用户验证
def login(func): def wrap(request, *args, **kwargs): # 如果未登陆,跳转到指定页面 if request.path == '/test/': return redirect('http://www.baidu.com') return func(request, *args, **kwargs) return wrap

浙公网安备 33010602011771号