1. 路由系统

  • 浏览器会自动给url后加一个“/”
  • django会自动给路由的正则表达式前面加一个“/”
  • django会给任何不带“/”结尾的url语句添加“/”(可设置)
  • 短路路由规则:匹配到第一条就忽略后面所有!
  • 所以路由顺序很重要!

1.1 普通路由

  1. url(r'^index/', views.index),

1.2 正则路由

  1. url(r'^page/\d+', views.page),

1.3 正则加括号

可以提供参数传递,按顺序接收,接收到的都是字符串

  1. # urls.py
  2. url(r'^page/(\d+)', views.page),
  3. # views.py
  4. def page(request, index):
  5. page = index
  6. return HttpResponse("page: 第%s页" % page)

1.4 正则加括号加指定参数名

提供指定参数传递,按参数名字进行接收,顺序可变,但参数名必须相同,接收到的都是字符串。

urls.py

  1. url(r'^page/(?P<page>\d+)/(?P<number>\d+)', views.page),

views.py

  1. def page(request, page, number):
  2. p = page
  3. n = number
  4. return HttpResponse("page: 第%s页 第%s条" %(p, n))

1.5 分级路由include

在 APP01 中新建urls文件

  1. from django.conf.urls import include
  2. url(r'index/', include(app01.urls)),

2. 模版系统

在html文件中使用模板语言

2.1 普通变量

  1. {{var}}

调用数组元素:(圆点加下标)

  1. list1 = [1,2,3]
  2. {{list.0}}
  3. {{list.1}}
  4. {{list.2}}

调用字典元素: (圆点加键值)

  1. dict1 = {"k1":"v1","k2":"v2"}
  2. {{dict1.k1}}
  3. {{dict1.k2}}

2.2 if 语句

在结构体内引用变量,不需要再加双大括号

  1. {% if 判断 %}
  2. ......
  3. {% else %}
  4. ......
  5. {% endif %}

2.3 for循环

  1. {% for i in data %}
  2. ......
  3. {% endfor %}

django内置特殊的用于for循环的变量:

  1. forloop.counter
  2. forloop.counter0
  3. forloop.first
  4. forloop.last

2.4 内置函数

  1. lower first last divisibleby等等。例如:
  2. {{ AAA”|lower}}
  3. 使用管道符引用函数名,左边的‘AAA’自动当作参数传递给lower函数
  4. 又或:判断当前循环的次数是否能被2整除
  5. {% if forloop.counter0|divisibleby:"2" %}
  6. <tr class="success">
  7. {% else %}
  8. <tr>
  9. {% endif %}

2.5 自定义函数

  1. templatetags
  2. register
  3. simple_tag
  4. filter等等……
  5. 忘记它吧……

2.6 继承模板

  1. {% extends "xxxx.html" %}

2.7 重写模板

  1. 在母版和子版式中使用同样的:
  2. {% block 取个名字 %}
  3. (每个子版专属的代码)
  4. {% endbloack %}

2.8 导入html代码

  1. {% include "xx.html" %}

与继承模板不同的是,导入的是xxx.html的完全代码,因此xxx.html中最好没有头部,title等代码,只有实际的功能代码。

3. 模型(model)

3.1 类结构

3.1.1 基础类型

  1. from django.db import models
  2. class userinfo(models.Model):
  3. name = models.CharField(max_length=30)
  4. email = models.EmailField()
  5. memo = models.TextField()

3.1.2 连表类型

  1. 一对多:models.ForeignKey("其他表")
  2. 多对多:models.ManyToManyField("其他表")
  3. 一对一:models.OneToOneField("其他表")

3.1.3 字段类型

  1. models.AutoField  
  • 自增列 = int(11)
  • 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
  1. models.CharField  

字符串字段,必须 max_length 参数

  1. models.BooleanField  

布尔类型=tinyint(1),不能为空,Blank=True

  1. models.ComaSeparatedIntegerField  

用逗号分割的数字=varchar,继承CharField,所以必须 max_lenght 参数

  1. models.DateField  

日期类型 date,对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。

  1. models.DateTimeField  

日期类型 datetime,同DateField的参数

  1. models.Decimal  

十进制小数类型 = decimal,必须指定整数位max_digits和小数位decimal_places

  1. models.EmailField  

字符串类型(正则表达式邮箱) =varchar,对字符串进行正则表达式

  1. models.FloatField  浮点类型 = double

  2. models.IntegerField  整形

  3. models.BigIntegerField  长整形

  1. integer_field_ranges = {
  2.   'SmallIntegerField': (-32768, 32767),
  3.  'IntegerField': (-2147483648, 2147483647),
  4.   'BigIntegerField': (-9223372036854775808, 9223372036854775807),
  5.   'PositiveSmallIntegerField': (0, 32767),
  6.   'PositiveIntegerField': (0, 2147483647),
  7. }
  1. models.IPAddressField  字符串类型(ip4正则表达式)

  2. models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)

参数protocol可以是:both、ipv4、ipv6,验证时,会根据设置报错

  1. models.NullBooleanField  允许为空的布尔类型

  2. models.PositiveIntegerFiel  正Integer

  3. models.PositiveSmallIntegerField  正smallInteger

  4. models.SlugField  减号、下划线、字母、数字

  5. models.SmallIntegerField  数字

数据库中的字段有:tinyint、smallint、int、bigint

  1. models.TextField  字符串=longtext

  2. models.TimeField  时间 HH:MM[:ss[.uuuuuu]]

  3. models.URLField  字符串,地址正则表达式

  4. models.BinaryField  二进制

  5. models.ImageField 图片

  6. models.FilePathField 文件

3.1.4 参数类型

  1. 1null=True
  2.   数据库中字段是否可以为空
  3. 2blank=True
  4.   django Admin 中添加数据时是否可允许空值
  5. 3primary_key = False
  6.   主键,对AutoField设置主键后,就会代替原来的自增 id
  7. 4auto_now auto_now_add
  8.   auto_now 自动创建---无论添加或修改,都是当前操作的时间
  9.   auto_now_add 自动创建---永远是创建时的时间
  10. 5choices
  11. GENDER_CHOICE = (
  12. (u'M', u'Male'),
  13. (u'F', u'Female'),
  14. )
  15. gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
  16. 6max_length
  17. 7default  默认值
  18. 8verbose_name  Admin中字段的显示名称
  19. 9name|db_column  数据库中的字段名称
  20. 10unique=True  不允许重复
  21. 11db_index = True  数据库索引
  22. 12editable=True  在Admin里是否可编辑
  23. 13error_messages=None  错误提示
  24. 14auto_created=False  自动创建
  25. 15help_text  在Admin中提示帮助信息
  26. 16validators=[]
  27. 17upload-to

3.1.5 Python3 下使用MySQL

settings:

配置

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME':'django01',
  5. 'USER': 'root',
  6. 'PASSWORD': '123456',
  7. 'HOST': '192.168.92.201',
  8. 'PORT': '3306',
  9. }
  10. }

注册APP:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'pga',
  9. ]

注意:由于Python3不支持MySQLdb(),需要以pycharm替代,在project的__init__.py中:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

3.2 表操作

3.2.1 基本操作

  1. # 增
  2. #
  3. # models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs
  4. # obj = models.Tb1(c1='xx', c2='oo')
  5. # obj.save()
  6. # 查
  7. #
  8. # models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
  9. # models.Tb1.objects.all() # 获取全部
  10. # models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
  11. # 删
  12. #
  13. # models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
  14. # 改
  15. # models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs
  16. # obj = models.Tb1.objects.get(id=1)
  17. # obj.c1 = '111'
  18. # obj.save() # 修改单条数据

3.2.2 进阶操作

利用双下划线将字段和对应的操作连接起来

  1. # 获取个数
  2. #
  3. # models.Tb1.objects.filter(name='seven').count()
  4. # 大于,小于
  5. #
  6. # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
  7. # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
  8. # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
  9. # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
  10. # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
  11. # in
  12. #
  13. # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
  14. # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
  15. # isnull
  16. # Entry.objects.filter(pub_date__isnull=True)
  17. # contains
  18. #
  19. # models.Tb1.objects.filter(name__contains="ven")
  20. # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
  21. # models.Tb1.objects.exclude(name__icontains="ven")
  22. # range
  23. #
  24. # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
  25. # 其他类似
  26. #
  27. # startswith,istartswith, endswith, iendswith,
  28. # order by
  29. #
  30. # models.Tb1.objects.filter(name='seven').order_by('id') # asc
  31. # models.Tb1.objects.filter(name='seven').order_by('-id') # desc
  32. # group by
  33. #
  34. # from django.db.models import Count, Min, Max, Sum
  35. # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
  36. # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
  37. # limit 、offset
  38. #
  39. # models.Tb1.objects.all()[10:20]
  40. # regex正则匹配,iregex 不区分大小写
  41. #
  42. # Entry.objects.get(title__regex=r'^(An?|The) +')
  43. # Entry.objects.get(title__iregex=r'^(an?|the) +')
  44. # date
  45. #
  46. # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
  47. # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
  48. # year
  49. #
  50. # Entry.objects.filter(pub_date__year=2005)
  51. # Entry.objects.filter(pub_date__year__gte=2005)
  52. # month
  53. #
  54. # Entry.objects.filter(pub_date__month=12)
  55. # Entry.objects.filter(pub_date__month__gte=6)
  56. # day
  57. #
  58. # Entry.objects.filter(pub_date__day=3)
  59. # Entry.objects.filter(pub_date__day__gte=3)
  60. # week_day
  61. #
  62. # Entry.objects.filter(pub_date__week_day=2)
  63. # Entry.objects.filter(pub_date__week_day__gte=2)
  64. # hour
  65. #
  66. # Event.objects.filter(timestamp__hour=23)
  67. # Event.objects.filter(time__hour=5)
  68. # Event.objects.filter(timestamp__hour__gte=12)
  69. # minute
  70. #
  71. # Event.objects.filter(timestamp__minute=29)
  72. # Event.objects.filter(time__minute=46)
  73. # Event.objects.filter(timestamp__minute__gte=29)
  74. # second
  75. #
  76. # Event.objects.filter(timestamp__second=31)
  77. # Event.objects.filter(time__second=2)
  78. # Event.objects.filter(timestamp__second__gte=31)

其他操作补充:

  1. # extra
  2. #
  3. # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
  4. # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
  5. # Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
  6. # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
  7. # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
  8. # F
  9. #
  10. # from django.db.models import F
  11. # models.Tb1.objects.update(num=F('num')+1)
  12. # Q
  13. #
  14. # 方式一:
  15. # Q(nid__gt=10)
  16. # Q(nid=8) | Q(nid__gt=10)
  17. # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
  18. # 方式二:
  19. # con = Q()
  20. # q1 = Q()
  21. # q1.connector = 'OR'
  22. # q1.children.append(('id', 1))
  23. # q1.children.append(('id', 10))
  24. # q1.children.append(('id', 9))
  25. # q2 = Q()
  26. # q2.connector = 'OR'
  27. # q2.children.append(('c1', 1))
  28. # q2.children.append(('c1', 10))
  29. # q2.children.append(('c1', 9))
  30. # con.add(q1, 'AND')
  31. # con.add(q2, 'AND')
  32. #
  33. # models.Tb1.objects.filter(con)
  34. # 执行原生SQL
  35. #
  36. # from django.db import connection, connections
  37. # cursor = connection.cursor() # cursor = connections['default'].cursor()
  38. # cursor.execute("""SELECT * from auth_user where id = %s""", [1])
  39. # row = cursor.fetchone()

3.2.3 连表操作

利用双下划线和 _set 将表之间的操作连接起来

表结构实例

  1. class UserProfile(models.Model):
  2. user_info = models.OneToOneField('UserInfo')
  3. username = models.CharField(max_length=64)
  4. password = models.CharField(max_length=64)
  5. def __unicode__(self):
  6. return self.username
  7. class UserInfo(models.Model):
  8. user_type_choice = (
  9. (0, u'普通用户'),
  10. (1, u'高级用户'),
  11. )
  12. user_type = models.IntegerField(choices=user_type_choice)
  13. name = models.CharField(max_length=32)
  14. email = models.CharField(max_length=32)
  15. address = models.CharField(max_length=128)
  16. def __unicode__(self):
  17. return self.name
  18. class UserGroup(models.Model):
  19. caption = models.CharField(max_length=64)
  20. user_info = models.ManyToManyField('UserInfo')
  21. def __unicode__(self):
  22. return self.caption
  23. class Host(models.Model):
  24. hostname = models.CharField(max_length=64)
  25. ip = models.GenericIPAddressField()
  26. user_group = models.ForeignKey('UserGroup')
  27. def __unicode__(self):
  28. return self.hostname

一对一操作

  1. user_info_obj = models.UserInfo.objects.filter(id=1).first()
  2. print user_info_obj.user_type
  3. print user_info_obj.get_user_type_display()
  4. print user_info_obj.userprofile.password
  5. user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
  6. print user_info_obj.keys()
  7. print user_info_obj.values()

一对多操作

  1. 类似一对一
  2. 1、搜索条件使用 __ 连接
  3. 2、获取值时使用 . 连接

多对多操作

  1. user_info_obj = models.UserInfo.objects.get(name=u'Dave')
  2. user_info_objs = models.UserInfo.objects.all()
  3. group_obj = models.UserGroup.objects.get(caption='CEO')
  4. group_objs = models.UserGroup.objects.all()
  5. # 添加数据
  6. #group_obj.user_info.add(user_info_obj)
  7. #group_obj.user_info.add(*user_info_objs)
  8. # 删除数据
  9. #group_obj.user_info.remove(user_info_obj)
  10. #group_obj.user_info.remove(*user_info_objs)
  11. # 添加数据
  12. #user_info_obj.usergroup_set.add(group_obj)
  13. #user_info_obj.usergroup_set.add(*group_objs)
  14. # 删除数据
  15. #user_info_obj.usergroup_set.remove(group_obj)
  16. #user_info_obj.usergroup_set.remove(*group_objs)
  17. # 获取数据
  18. #print group_obj.user_info.all()
  19. #print group_obj.user_info.all().filter(id=1)
  20. # 获取数据
  21. #print user_info_obj.usergroup_set.all()
  22. #print user_info_obj.usergroup_set.all().filter(caption='CEO')
  23. #print user_info_obj.usergroup_set.all().filter(caption='DBA')

4. 跨站请求伪造

一、简介

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

全局:

  中间件 django.middleware.csrf.CsrfViewMiddleware

局部:

@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。

@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。

注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

二、应用

1、普通表单

  1. veiw中设置返回值:
  2.   return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))  
  3. 或者
  4. return render(request, 'xxx.html', data)
  5. html中设置Token:
  6.   {% csrf_token %}

2、Ajax

对于传统的form,可以通过表单的方式将token再次发送到服务端,而对于ajax的话,使用如下方式。

view.py

  1. from django.template.context import RequestContext
  2. # Create your views here.
  3. def test(request):
  4. if request.method == 'POST':
  5. print request.POST
  6. return HttpResponse('ok')
  7. return render_to_response('app01/test.html',context_instance=RequestContext(request))

text.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. {% csrf_token %}
  9. <input type="button" onclick="Do();" value="Do it"/>
  10. <script src="/static/plugin/jquery/jquery-1.8.0.js"></script>
  11. <script src="/static/plugin/jquery/jquery.cookie.js"></script>
  12. <script type="text/javascript">
  13. var csrftoken = $.cookie('csrftoken');
  14. function csrfSafeMethod(method) {
  15. // these HTTP methods do not require CSRF protection
  16. return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  17. }
  18. $.ajaxSetup({
  19. beforeSend: function(xhr, settings) {
  20. if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
  21. xhr.setRequestHeader("X-CSRFToken", csrftoken);
  22. }
  23. }
  24. });
  25. function Do(){
  26. $.ajax({
  27. url:"/app01/test/",
  28. data:{id:1},
  29. type:'POST',
  30. success:function(data){
  31. console.log(data);
  32. }
  33. });
  34. }
  35. </script>
  36. </body>
  37. </html>

更多:https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

Python-Django进阶的更多相关文章

  1. python Django 进阶篇

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  2. Python之路,Day16 - Django 进阶

    Python之路,Day16 - Django 进阶   本节内容 自定义template tags 中间件 CRSF 权限管理 分页 Django分页 https://docs.djangoproj ...

  3. python 自动化之路 day 20 Django进阶/BBS项目【一】

    一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...

  4. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  5. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  6. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  7. django进阶-4

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

  8. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  9. Django进阶知识

    drf学习之Django进阶点 一.Django migrations原理 1.makemigrattions: 相当于在每个app下的migrations文件夹下生成一个py脚本文件用于创建表或则修 ...

  10. django进阶-查询(适合GET4以上人群阅读)

    前言: 下篇博客写关于bootstrap... 一.如何在脚本测试django from django.db import models class Blog(models.Model): name ...

随机推荐

  1. 关系型数据库与NOSQL

    本文转载自: http://www.cnblogs.com/chay1227/archive/2013/03/17/2964020.html(只作转载, 不代表本站和博主同意文中观点或证实文中信息) ...

  2. 解决Visual C++ Redistributable for Visual Studio 2015的安装问题

    1. Visual C++ Redistributable for Visual Studio 2015系统要求:Windows 7情况下必须是Windows 7 with SP1.或者Windows ...

  3. Code First :使用Entity. Framework编程(6) ----转发 收藏

    Chapter6 Controlling Database Location,Creation Process, and Seed Data 第6章 控制数据库位置,创建过程和种子数据 In prev ...

  4. 小记max-with与 max-device-width

    max-with是浏览器的宽度,max-device-width是设备显示器的宽度 浏览器宽度不等于显示器宽度 浏览器可以缩小 1.max-device-width是设备整个显示区域的宽度,例如,真实 ...

  5. javascript面试题:如何把一句英文每个单词首字母大写?

    上周看到大家在JS群讨论如何把一句英文句子单词收割字母大写,大家都说用正则简单,对于正则还是有点模糊,于是乎自己敲了下 //面试题:如何把一句英文每个单词首字母大写? var str="wh ...

  6. 完美 全兼容 解决 文字两端对齐 justify 中文姓名对齐

    text-align:justify; 所有浏览器都支持,text-justify之类的却只有IE支持,就不要考虑了. justify我的理解,使元素内部的子元素两端对齐,子元素当然只能是inline ...

  7. iOS适配 旧项目工程在iOS9下不能正常显示

    在iOS开发中,很多时候会用到旧项目,比如版本的升级.使用Demo等等, iOS SDK正在不断的升级,不断的升级给iOS开发带来了新的活力. 然而在iOS SDK新的版本出来之后,旧项目可能会出现新 ...

  8. list集合的排序Comparator和Collections.sort

    一个例子 package sortt; import java.util.ArrayList; import java.util.Collections; import java.util.Compa ...

  9. iOS使用Zbar扫描二维码

    iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...

  10. listview的ViewHolder优化

    1.自定义listview,首先在activity.xml中插入一个listview,可以用android:divider=""设置分割线颜色样式,android:dividerH ...