python 学习第二十一天,django知识(三)
一,django的url路由系统总结
1,url(/index/,函数或者类)
2,url(/index/(\d+), 函数或者类)
3,url(/index/(?P<nid>\d+),函数或者类)
4,url(/index/(?P<nid>\d+),name="root",函数或者类)
(1) 在views.py文件中通过reverse()反转url
(2) 在templates中的文件中引用{% url 'root' 1 %}
5,url(/crm/,include('app01.urls')进行路由分发
6,默认值url(/index/,{'web':'root'},函数或者类)
在views.py中定义函数 def func(reqeust,web):return ...来接收web这个参数
7,命名空间
(1)project.urls.py
from djanogo.conf.urls import url,include urlpatterns = [
url(r'^a/',include('app01.urls',namespace='author-polls')),
url(r'^b/',include('app01.urls',namespace='publisher-polls')),
]
(2)app01.urls.py
from django。conf.urls import url
from app01 import views app_name = 'app01'
urlpatterns = [
url(r'^(?P<pk>\d+/$',views.detail,name='detail')
]
(3)app01.views.py
def detail(request,pk):
print(request.resolver_match)
return HttpResponse(pk)
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
v = reverse('author-polls:detail',kwargs={'pk':11})
{% url 'app01:detail' pk=12 pp=99 %}
django 中的路由系统和其它语言的框架有所不同,在django中每个请求的url都要有一条路由映射,这样才能将请求交给对应的view中的函数去处理.其它大部分的WEB框架则是对一类的url请求做一条路由映射,从而使路由系统变得简洁
二,django的路由请求周期知识点
(1)Form 表单提交,页面肯定刷新,整个流程为,提交form 表单,发送数据到到后台进行处理,然后等待后台处理完成返回数据,并跳转到其它页面
用户提交请求到url.py文件中的url,url接收到请求后,匹配到后端的视图函数,并将数据发送到后端,后端将请求处理完成之后,或者直接返回字符串给用户(HttpRespose),或者通过render方法中的open函数打开相应的templates中的html文件,将其中的所有的变量进行替换,最终将html文件和数据都已字符串的形式发送给用户,或者用redirect('/index/')将另外一个请求已字符串的形式发送给用户,用户跳转到其它页面
(2)ajax 提交
$.ajax({
url:'/index/';
data:{'k':'v','list':[1,2,3,4]}; #或者$(form对象).serilize() 已列表的形式获取整个form中的数据
type:'POST'; #向后台提交数据的方式
dataType:'JSON'; #以json形式向后台提交数据
traditional:true; #需要向后台发送列表时,必须以加这个参数
success: function(d) { #d 为形式参数,可以任意定义
location.reload() #刷新整个页面
location.href() #跳转到其它页面
}
})
三,django views知识点
(1)views中的请求方法
def func(request):
request.POST
request.GET
request.FILES
request.getlist
request.method
request.path_info #获取当前的请求的url
(2)request.environ 封装了用户所有的请求头部信息
from django.core.handlers.wsgi import WSGIRequest
request.environ
request.environ['HTTP_USER_AGENT']
四,模板的继承
1,在主模板中定义block {% block title %}{% endblock %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>
<link rel="stylesheet" href="/static/commons.css" />
<style>
.pg-header{
height: 50px;
background-color: seashell;
color: green;
}
</style>
{% block css %} {% endblock %}
</head>
<body>
<div class="pg-header">小男孩管理</div>
<div>
<a>asdf</a>
<a id="">asdf</a>
<a>asdf</a>
<a>asdf</a>
<a>asdf</a>
</div>
<iframe src="/"></iframe>
</body>
</html>
2,在子模板中引用block,一个html 只能继承一个模板,但可以有多个include
{% extends 'master.html' %}
{% block title %}用户管理{% endblock %}
{% block content %}
<h1>用户管理</h1>
<ul>
{% for i in u %}
<li>{{ i }}</li>
{% endfor %}
</ul>
{% for i in u %}
{% include 'tag.html' %}
{% endfor %}
{% endblock %}
{% block css %}
<style>
body{
background-color: red;
}
</style>
{% endblock %}
{% block js %}
<script></script>
{% endblock %}
3,模板中的自定义simple_tag
(1)在app 中创建templatetags模板,且目录名称必须为这个名字
(2)创建任意.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)
(3)在使用自定义simple_tag的html文件中导入之前创建的xx.py文件名
{% load xx %}
(4)使用simple_tag
{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}
(5)在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',
)
4,自定义simple_tag 中的装饰器用法
(1)@register.simple_tag 使用方法
{% my_simple_time 1 2 3%} #my_simple为.py文件中的函数名,可以传多个参数,并且参数之间允许有空格
(2)@register.filter
{{"参数一"|处理函数名:"参数二"}} #参数二只能有一个,如果需要传递两个参数,可以“参数二,参数三”,然后再后端函数中进行单独处理,
#应用场景在模板语言中的if判断中,例如{% if "参数一"|处理函数名:"参数二" %}
五,django Cookie
1,获取Cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default: 默认值
salt: 加密盐
max_age: 后台控制过期时间
2,设置Cookie
rep = HttpResponse(...) 或 rep = render(request, ...) rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
3,由于Cookie保存在客户端电脑上,所以Javascript或者Jquery 都可以操作Cookie
<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });
python 学习第二十一天,django知识(三)的更多相关文章
- Python 学习第二十天 django知识
一,django models 1,django ORM获取后台数据的方式,总共有三种 (1)v1 = models.Business.objects.all() 返回值为QuerySet类型,内 ...
- Python学习笔记(Django篇)——3、创建第一个数据库模型
Django里面集成了SQLite的数据库,对于初期研究来说,可以用这个学习. 第一步,创建数据库就涉及到建表等一系列的工作,在此之前,要先在cmd执行一个命令: python manage.py ...
- python 学习笔记十七 django深入学习二 form,models
表单 GET 和 POST 处理表单时候只会用到GET 和 POST 方法. Django 的登录表单使用POST 方法,在这个方法中浏览器组合表单数据.对它们进行编码以用于传输.将它们发送到服务器然 ...
- Python学习笔记23:Django构建一个简单的博客网站(一个)
在说如何下载和安装Django,本节将重点讨论如何使用Django站点. 一 新建project 命令:django-admin startproject mysite # 有的须要输入:django ...
- Python学习第二节——基础知识
# !/usr/bin/edv python 脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它.# -*- coding:UTF-8 -*- 标明编码注释 ...
- Python学习笔记_04:Django框架简介
目录 1 什么是Django? 2 Django框架的开发环境搭建 3 Django操作MySql数据库简介 4 功能强大的Django管理工具应用 1 什么是Django? Django是应用于We ...
- Python自动化运维 - Django(三)CSRF - Cookie&Session
CSRF跨站请求伪造 CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求 ...
- python学习笔记之文件操作(三)
这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...
- Python学习笔记——1——基础知识
1.1.变量和算法 python语言很类似人类语言,变量不需要定义类型.比如: 整型 字符串类型 数组 Java int a=12 String s="test" String[] ...
随机推荐
- jQuery $(document).ready() 与window.onload的区别
ps:jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,虽然具有类似的效果,但是它们在触发操作的时间上存在着微妙的差异. 在j ...
- Android ActionBar 初探
1.指南,例子,个人感觉 首先上官网指南链接http://developer.android.com/guide/topics/ui/actionbar.html 参考了官网上的例子http://de ...
- MySQL报错:Got error 28 from storage engine
今天碰到数据库出错: Got error 28 from storage engine 查了一下,数据库文件所在的盘应该没事,应该是数据库用的临时目录空间不够 问题原因: 磁盘临时空间不够导致. 解决 ...
- linux 命令01
mkdir 创建目录 cd 进入目录 touch 创建文件 touch oldboy.txt vi 编辑器,相当于记事本,有编辑功能,较弱 vim 复杂编辑器,相当于,emeditor,editplu ...
- iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- VS2015编译boost1.62
VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- ffmpeg-201612[01,08,10,17,21,27,30]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- 解决自定义Shiro.Realm扩展类不能用注解(@Resource或@Autowire)自动装配的问题
问题产生原因:加载Realm时其他Spring配置文件(xml)尚未加载,导致注入失败. 解决方法:编写一个设置类把注入工作提前完成. package com.xkt.shiro import org ...