cookie session

cookie的定义:

  1. 保存在浏览器上的一组组键值对 (请求头)
  2. 为什么要有?
    http协议是无状态,每次的请求之间是相互独立的,没有办法保存状态。
  1. Django中操作cookie

设置 set-cookie

reponse.set_cookie(key,value,max_age=6,path='/')

reponse.set_signed_cookie(key,value,salt='xxx',max_age=6,path='/')

获取

request.COOKIES request.COOKIES.get(key)

request.get_signed_cookie(key,salt='xxx',default='')

删除 set-cookie

reponse.delete_cookie(key)

session

  1. 保存在服务器上的一组组键值对,必须依赖cookie。
  2. 为什么要有session?
  1. cookie保存在浏览器上,不太安全
  1. 大小个数收到限制
  1. Django中的操作:

设置

request.session[key] = value

获取

request.session[key] request.session.get(key)

删除

request.session.pop(key)

del request.session[key]

request.session.delete() # 删除所有的session数据

request.session.flush() # 删除所有的session数据 和 cookie

其他:

request.session.set_expiry(value) # 设置

request.session.clear_expiried(value) # 清空已经失效的session数据

配置:

from django.conf import global_settings

SESSION_SAVE_EVERY_REQUEST = True # 每次请求都更新session
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 浏览器关闭数据就失效
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 存在的位置
# 数据库 缓存 缓存+数据库 文件 加密cookie

路由

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^get_img/',views.get_img)

]

正则表达式

^ $ \w \d \S . [a-zA-Z0-9]{4} + ? * .*?

分组和命名分组 传参的方式 ?

url(r'^get_(img)/',views.get_img)
# 捕获的参数按照 位置传参 传递给函数
url(r'^get_(?P<name>img)/',views.get_img)
# 捕获的参数按照 关键字传参 传递给函数

路由分发

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls')),
url(r'^get_img/',views.get_img)
]

url的命名和反向解析

静态路由

url(r'^login/', views.login,name='login'),

反向解析

模板

{% url 'login' %}   ——》  '/app01/login/'

py文件

from django.urls import reverse
reverse('login') ——》 '/app01/login/'

分组

url(r'^del_publisher/(\d+)/', views.del_publisher,name='del_pub'),

反向解析

模板

{% url 'del_pub' '1' %}   ——》  '/app01/del_publisher/1/'

py文件

from django.urls import reverse
reverse('del_pub',args=('1',)) ——》 '/app01/del_publisher/1/'

命令分组

url(r'^del_publisher/(?P<pk>\d+)/', views.del_publisher,name='del_pub'),

反向解析

模板

{% url 'del_pub' '1' %}   ——》  '/app01/del_publisher/1/'
{% url 'del_pub' pk='1' %} ——》 '/app01/del_publisher/1/'

py文件

from django.urls import reverse
reverse('del_pub',args=('1',)) ——》 '/app01/del_publisher/1/'
reverse('del_pub',kwargs={'pk':'1'}) ——》 '/app01/del_publisher/1/'

namespace

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/',include('app01.urls',namespace='app01' )),
url(r'^app02/',include('app02.urls',namespace='app02')),
]
{% url 'app01:del_pub' '1' %}
reverse('app01:del_pub',args=('1',))

 

MVC

M: model 模型 和数据库交互

V: View 视图 HTML

C: controller 控制器 业务逻辑 流程

MTV

M:model 模型 ORM

T: template 模板 Html

V: view 视图 业务逻辑

 

FBV: function based view 函数

CBV : class based view 类

定义:

from django.views import View

class AddPublisher(View):

def get(self,request,*args,**kwargs):
# 处理get请求的逻辑
return response

def post(self,request,*args,**kwargs):
# 处理post请求的逻辑
return response

def put(self,request,*args,**kwargs):
# 处理put请求的逻辑
return response

urls.py

url(r'^add_publisher/', views.AddPublisher.as_view()),

加装饰器

FBV

@login_required
def publisher(request):

CBV

from django.utils.decorators import method_decorator
# 加在某个方法上
@method_decorator(login_required)
def get(self, request, *args, **kwargs):

# 加在dispatch方法上

@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
ret = super().dispatch(request, *args, **kwargs)
return ret

# 加在类上
# @method_decorator(login_required,name='get')
@method_decorator(login_required,name='dispatch')
class AddPublisher(View):

request:

request.method  # 请求方法 GET POST 
request.path_info # 路径 不包含ip和端口 也不包含参数
request.GET # url上携带的参数 {}
request.POST # form提交POST请求的参数 {} 编码类型是urlencode
request.body # 请求体 b''
request.FILES # 上传的文件 编码的类型是 enctype="multipart/form-data"
request.COOKIES # cookie的字典
request.session # session的数据
request.META # 请求头 小写 ——》 大写 HTTP_ - _> _

request.get_full_path() # 路径 不包含ip和端口 包含参数
request.get_signed_cookie() # 获取加密cookie
request.is_ajax() # 是否是ajax

response对象

HttpResponse('xxxx')  # 返回字符串   Content-Type: text/html; charset=utf-8
render(request,'模板的路径',{}) # 返回一个页面
redirect('路径') # 重定向 状态码301 302 响应头 Location:路径


from django.http.response import JsonResponse

def get_data(request):
ret = {'name': 'alex', 'pwd': 'dsb'}
ret = [1,2,3]
return JsonResponse(ret,safe=False) # 非字典 可以被json序列化

模板中

变量 {{ }}

通过(.)取相应的内容

.索引 .key .属性 .方法

优先级: .key > .属性 或 .方法 > .索引

过滤器:

{{ 变量|过滤器 }} {{ 变量|过滤器:参数 }}

{{ kong | default:'没有传参' }}

标签

{% %}

for

{% for i in list %}

{{ i }}

{% endfor %}

 

if 不支持算数运算

{% if 1|add:1 > 0 %}  

{% endif %}

if 不支持连续判断

csrf

{% csrf_token %}  #  form表单中有一个隐藏的input标签  name=‘csrfmiddlewaretoken’

母版和继承

母版:

模板,提取出多个页面公共部分放在一个母版中,定义上多个block块,让子页面重新复写。

继承:

  1. {% extends ‘母版的名字’ %}
  2. 重写block块。

注意点:

1. {% extends ‘母版的名字’  %}  母版名字 的引号好带上   不带会当做变量
  1. {% extends ‘母版的名字’ %} 上不要写内容
  2. 要替换母版的内容都写在block块中
  3. 定义多个block块, css,js