python/数据库操作补充—模板—Session

一、创建一个app目录

在models.py只能类进行进行创建表
 class Foo:
xx= 字段(数据库数据类型)
字段类型
字符串
EmailField(CharField):
IPAddressField(Field)
URLField(CharField)
SlugField(CharField)
UUIDField(Field)
FilePathField(Field)
FileField(Field)
ImageField(FileField)
CommaSeparatedIntegerField(CharField)
时间类:
models.DateTimeField(null=True)
数字:
num = models.IntegerField()
num = models.FloatField()
mum = models.DecimalField(max_digits=30,decimal_places=10)
枚举(Django):
color_list = (
(1,'黑色'),
(2,'白色'),
(3,'蓝色')
)
color = models.IntegerField(choices=color_list)

class Foo

二、字段参数

字段参数
 字段参数:
null=True, 允许为空
default='', 设置默认值
db_index=True, 设置索引
unique=True 设置唯一索引

字段参数 演示

三、创建索引

创建索引
class Meta:
# unique_together = (
# ('email','ctime'), 创建联合唯一索引
# ) # index_together = (
# ('email','ctime'), 创建联合索引
# )

四、DjangoAdmin提供的参数  

DjangoAdmin提供的参数:
verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
自定义错误类型
 error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{'null': "不能为空.", 'invalid': '格式错误'} 有些是不能进行自定义

自定义错误类型 演示

validators          自定义错误验证(列表类型),从而定制想要的验证规则
                                 validators          自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ] a. 直接通过(因为数据库可以不添加数据)
models.Userinfo.objects.create(....)
-- ModelForm b. 影响Django自带的管理工具admin

自定义错误验证 演示

五、模板

1、模版的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

 def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
 from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
 import datetime
from django import template
import DjangoDemo.settings now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html
 from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime def current_datetime(request):
now = datetime.datetime.now()
t = get_template('current_datetime.html')
html = t.render(Context({'current_date': now}))
return HttpResponse(html)
 return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

2、模版语言

 模板中也有自己的语言,该语言可以实现数据展示

{{ 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

#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe register = template.Library() @register.simple_tag
def my_simple_time(v1,v2,v3):
return v1 + v2 + v3 @register.simple_tag
def 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 

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)

六、Session

Session是什么?
Session 是保存在服务端的数据
Cookie是什么?
Cookie是保存在客户端浏览器上的键值对

Session个人理解 

个人Session理解说明:
Session就是在存再服务端的数据,每次有人来访问网页Session会检测用户是否带Session发送的随机字符串,如果有随机字符串Session就自己会查看自己以字典形式保存在内存的数据,字典键就是Session生成的随机字符串,字典的值就是用户的信息。
整体总结:
Session是依赖于Cookie的一种会话保持,Session会向第一次成功访问的用户发送一个随机的字符串,以便以后用户登录可以准确的定位到用户是谁,用户的相关信息。
需要注意一点,每个用户之间都是独立的字典,不会出现用户信息混乱状况,使用Session的好处,用户查看不到敏感信息
个人Cookie理解说明:
Cookie是存在客户端浏览器上的键值对
Cookie的可以用于用户登录验证,投票
整体总结:
Cookie会向第一次成功登陆页面的用户发送一个键值对,如果下次登陆服务端会检测用户是否携带Cookie如果携带就可以直接进行访问不需要再进用户验证。
Cookie可以设置过期时间 和哪些用户可以进行访问

Session 保存在服务端的数据(本质是键值对)

配置文件中可以指定存储位置

数据库 Session

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

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

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

数据库用于做持久化,缓存用于提高效率

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

b. 使用

    同上

缓冲+数据库  先是去数据库中查找,没有就去数据库中查找

Cookie 中存放Session

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

用户验证

 

 

最新文章

  1. Python3中的字符串函数学习总结
  2. web程序的路径笔记
  3. linux常用的一些命令(不断增加中)
  4. Python学习 之 switch语句
  5. 常用数据结构[OpenCV 笔记12]
  6. 出现java.lang.reflect.UndeclaredThrowableException异常
  7. nginx 防火墙、权限问题
  8. HighCharts中的Ajax请求的2D折线图
  9. docker服务各个模块
  10. C#窗体加载和控件加载不同步导致控件闪烁
  11. springBoot整合ftp上传图片功能
  12. 根据id来大量删除数据between
  13. ORA-245: In RAC environment from 11.2 onwards Backup Or Snapshot controlfile needs to be in shared location (Doc ID 1472171.1)
  14. ubuntu 禁用 guest 账户
  15. 模拟django配置环境进行数据增删改查,测试的时候有用
  16. 使用netperf测试网络性能
  17. JUC集合之 ConcurrentSkipListMap
  18. 20155336 2016-2017-2《JAVA程序设计》第二周学习总结
  19. (转)虚拟路由器冗余协议【原理篇】VRRP详解
  20. Linux下捕捉信号

热门文章

  1. Git -- 分支与合并 (命令行+可视化工具p4merge)
  2. SpringBoot工作机制
  3. 关于try catch finally
  4. 收集nodejs经典组件:
  5. 笔记:Hibernate SQL 查询
  6. Java语法基础(1)
  7. servlet的执行过程
  8. 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
  9. android studio视频教学
  10. Java学习日记——基本数据类型