模板的导入使用
相当于python的import
比如:导入form表单
在需要导入的地方写
{% include “xxx.html” %}
注:导入多少相同的html,就显示多少
案例:
{% load xx %} <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Title</title> </head> <body> <ul> <li>{{ myli.0 }}</li> <li>{{ myli.1 }}</li> <li>{{ myli.2 }}</li> </ul> {% include “xxx.html” %} <ul> <li>{{ mydict.name }}</li> <li>{{ mydict.age }}</li> </ul> <hr> </body> </html>
模板的内置函数
<hr> {{ name|upper }} 将name变量的值name传给upper这个内置函数 {{ name|lower }} {{ name|first|upper }} 只显示第一个首字母,并且大写 {{ name|title }} 显示全部,并且首字母大写 {{ name|truncatewords:'2' }} 只显示前两个单词,后面省略
import datetime 下面内置函数需要在函数视图写这些,再传入
ctime = datetime.datetime.now()
{{ ctime|date:"Y-m-d H:i:s" }} 显示2019-02-02 07:04:23 <hr>
底层就是调用了python函数
模板的自定制函数
配置:
想使用自定义函数,需要在使用的地方上的app文件夹下创建一个templatetags(名字不能错)文件夹,
然后在下面创建py文件,这里面就可以自定义函数
1.simple_filter:
py文件中:
from django import template register = template.Library() @register.filter() def my_func(val, arg1): 只能接受两个参数 return val + arg1
HTML文件中
{% load xx %} 想使用自定制函数,上面必须写这行,xx是py文件的文件名 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Title</title> </head> <body> <hr> {{ name|my_func:'kkkk'}} 传入两个参数,函数后面不能有空号 <hr> </body> </html>
2.simple_tag:
py文件中
from django import template register = template.Library() @register.simple_tag() def my_tag(val, arg1, arg2): 后面接受无数参数 return val + arg1 + arg2
HTML文件中
{% load xx %} 想使用自定制函数,上面必须写这行,xx是py文件的文件名 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Title</title> </head> <body> <hr> {% my_tag 'zekai' 'is' 'jjj' %} <hr> </body> </html>
session
特点:
1.存在于服务端的包含用户敏感信息的键值对
如下:
{
“cookie值” : {“name”:‘zekai’, 'age‘:18},
“cookie值1” : {“name”:‘zekai2’, 'age‘:34},
}
2.如果浏览器cookie被禁用,也可以拿到cookie用第三方软件去访问
主页 def test(request): # 获取session name = request.session.get('name') request.session底层原理: 通过sessionid这个键拿到cookie的值,在通过cookie的值拿到对应唯一一个用户,从而get("name") 如果cookie值都拿不到,根本不会拿到用户信息,所以必须让他跳转到登录 if name: return render(request, "test.html", { "name":name}) 登录页面 def login(request): if request.method == 'GET': return render(request, 'login.html') else: username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'zekai' and pwd == "123": ### 设置session值 request.session['name'] = username request.session['pwd'] = pwd request.session['age'] = 12 上面完成后经过了这两个步骤: 1. 向浏览器设置cookie值 {'sessionid':'i93rkrcw9snt8wbups8gb3owm09e393g'} 2. 服务端记录session值(默认记录在数据库中) { “cookie值” : {“name”:‘zekai’, 'age‘:18}, } 数据库session表中信息: cookie是第一列 用户敏感信息加密过后放在第二列 最后一列是cookie过期时间(默认两个星期过期) 注意:前提需要完成表模型的两个操作指令,也就是生成一张session表 return HttpResponse('ok') else: return render(request, 'login.html')
session的使用
# 查询session值 # print(request.session.keys()) # dict_keys(['name', 'pwd', 'age']) # print(request.session.values()) # dict_values(['zekai', '123', 12]) # print(request.session.items()) # dict_items([('name', 'zekai'), ('pwd', '123'), ('age', 12)]) # 设置session值 request.session['name'] = username request.session['pwd'] = pwd request.session['age'] = 12 request.session.session_key #拿到当前登录过用户的cookie request.session.clear_expired() #当前用户的cookie有效期过期了,在数据库中把这条数据删除 request.session.exists("session_key") #判断要登录的用户数据库中是否有cookie值 request.session.clear() #清空session(用在用户注销和退出账号..)
request.session.fiush() #清空session(用在用户注销和退出账号..)
request.session.delete("session_key") #清空Session数据‘session_kry’对应的值 #手动设置数据库表中的cookie过期时间 request.session.set_expire(value) * 如果value是个整数,session会在value秒数后失效。 * 如果value是通过datatime或timedelta模块传入的时间(2019-06-12),session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,就是默认的两个周失效
session中的cookie设置以及session的存放介质
准备工作:
在settings文件中,STATIC_URL='/STATIC/'下粘贴
1. SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 默认引擎(session数据存放到数据库中) SESSION_COOKIE_NAME = "sessionid" # 浏览器上cookie的key SESSION_COOKIE_PATH = "/" # 在哪个url下cookie生效 (set_cookie用法相同) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名 (set_cookie用法相同) SESSION_COOKIE_SECURE = False # 是否Https传输cookie (set_cookie用法相同) SESSION_COOKIE_HTTPONLY = True # 是否cookie只支持http传输 (set_cookie用法相同) SESSION_COOKIE_AGE = 1209600 # cookie失效时间是多少秒(默认2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 每次登录更新一下cookie过期时间,反之不更新 2. SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎(session数据存放到内存中) SESSION_CACHE_ALIAS = 'default' #使用哪个内存 SESSION_COOKIE_NAME = "sessionid" SESSION_COOKIE_PATH = "/" SESSION_COOKIE_DOMAIN = None SESSION_COOKIE_SECURE = False SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_AGE = 1209600 SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_SAVE_EVERY_REQUEST = False 3. SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎(session数据存放到文件中) SESSION_FILE_PATH = None # 填写文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" SESSION_COOKIE_PATH = "/" SESSION_COOKIE_DOMAIN = None SESSION_COOKIE_SECURE = False SESSION_COOKIE_HTTPONLY = True SESSION_COOKIE_AGE = 1209600 SESSION_EXPIRE_AT_BROWSER_CLOSE = False SESSION_SAVE_EVERY_REQUEST = False 4. SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎(session数据存放到缓存和数据库中) #取session先取缓存,没有再去数据库找
补充:
关系型数据库:(基于硬盘的)
sqllite mysql oracle db2
菲关系型数据库:(基于内存的)
redis, mongdb, memcahce
中间件(类)
ps:wsgiref是Django的wsgi.py文件,用于启动Django的socket服务器
应用:
做预处理的时候, 将代码写 在中间件中,
来判断是否是IP黑名单中的值
.....
准备工作:
1.自己在Django中建个文件
2.在这个文件中写类
3.添加中间件
import m1,m2 - settings: MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'm1.M1', #自己写的中间件 'm2.M2' #自己写的中间件 ]
案例1:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self, request): print('m1.process_request') return HttpResponse('回去吧 老弟') #什么不写返回值为null,也可以写HttpResponse def process_response(self, request, response): print('m1.process_response') return response
案例2:
from django.utils.deprecation import MiddlewareMixin from django.shortcuts import HttpResponse class M1(MiddlewareMixin): def process_request(self, request): print('m1.process_request') def process_response(self, request, response): print('m1.process_response') return response def process_view(self, request, view_func, view_args, view_kwargs): #view_func要访问视图函数的函数 view_args,view_kwargs是给要访问视图函数传参 print(view_func, view_func.__name__) return HttpResponse('回去吧 老弟。。。')
注: process_request : 请求必经的一个方法
process_response: 这个响应必经的一个方法
MTV 和 MVC
项目目录结构的设计模式
MVC(适用所有语言): 浏览器-------------------> 函数或者类处理 ------------------> 数据库 业务逻辑 views: controllers models: 大量html页面 loginController.py LoginModel.py MVC django: M : models T : Templates (各种html页面) 相当于views V :Views(视图处理函数) 相当于 controllers 客户 ------点餐--------> 服务员 ------处理菜单需求--------> 厨师 <------------------ <-------------------------