Django 千锋培训读书笔记
https://www.bilibili.com/video/av17879644/?p=1切换到创建项目的目录  cd C:\Users\admin\Desktop\DjangoProject
创建名为project的项目命令  django-admin startproject project注:所有路径不要有中文切换到目录cd C:\Users\admin\Desktop\DjangoProject\project
目录层级说明:manage.py  一个命令行工具,可以让我们用多种方式对Django项目进行交互__init__.py 一个空文件,它告诉Python这个目录应该被看做一个包settings.py 项目的配置文件(主要处理文件)urls.py     项目的url声明 (主要处理文件)wsgi.py     项目与WSGI兼容的Web服务器入口
配置数据库   Django默认使用SQLite数据库在settings.py文件中通过DATABASES选项进行数据库配置
配置MySQL    Python3.x中安装的是PyMySQL在__init__.py文件中写入两行代码import pymysqlpymysql.install_as_MySQLdb()以数据库sunck为例进行示范:对settings.py中的DATABASES进行设置DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': "sunck",'USER': "root",'PASSWORD': "admin123",'HOST': "localhost",'PORT': "3306"}}
创建应用--在一个项目中可以创建多个应用,每个应用进行一种业务处理打开CMD,进入project(目录名)的目录下,输入命令创建名为myApp的app:python manage.py startapp myAPP
myAPP目录说明admin.py    进行站点配置models.py   创建模型views.py    创建视图
激活应用  在settings.py文件中,将myApp应用加入到INSTALLED_APPS选项中INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','myApp',]
定义模型 概述:有一个数据表就对应有一个模型在models.py文件中定义模型引入:from django.db import models模型类要继承models.Model类示例:class Grades(models.Model):gname = models.CharField(max_length=20)gdate = models.DateTimeField()ggirlnum = models.IntegerField()gboynum = models.IntegerField()isDelete = models.BooleanField(default=False)class Students(models.Model):sname = models.CharField(max_length=20)sgender = models.BooleanField(default=True)sage = models.IntegerField()scontend = models.CharField(max_length=20)isDelete = models.BooleanField(default=False)sgrade = models.ForeignKey("Grades", on_delete=models.CASCADE,)说明:不需要定义主键,在生成时自动添加,并且值为自动增加
在数据库中生成数据表生成迁移文件执行 python manage.py makemigrations    在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表执行迁移执行 python manage.py migrate           相当于执行MySQL语句创建了数据表测试数据操作
进入到python shell执行 python manage.py shell
引入包from myApp.models import Grades, Studentsfrom django.utils import timezonefrom datetime import *
查询所有数据类名.objects.all()示例: Grades.objects.all()
添加数据本质:创建一个模型类的对象实例示例:CMD窗口下:grade1 = Grades()grade1.gname = "python04"grade1.gdate = datetime(year=2017, month=7, day=17)grade1.ggirlnum = 3grade1.gboynum = 70grade1.save()
查看某个对象类名.objects(pk=索引号)示例:Grades.objects.get(pk=2)Grades.objects.all()
修改某个数据模型对象属性 = 新值示例:grade2.gboynum = 60grade2.save()
删除数据模型对象.delete()grade2.delete()注意:这是物理删除,数据库中的相应数据被永久删除
关联对象示例:stu = Students()stu.sname = "Xue Yanmei"stu.sgender = Falsestu.sage = 20stu.scontend = "I am Xue Yanmei"stu.sgrade = grade1stu.save()获得关联对象的集合需求:猎取python04班级的所有学生对象名.关联的类名小写_set.all()示例:grade1.students_set.all()需求:创建曾志伟,属于python04班级示例:stu3 = grade1.students_set.create(sname=u'Zhen Zhiwei',sgender=True,scontend=u"I am Zhen Zhiwei",sage=45)注意:这样创建的数据直接被添加到了数据库当中。
启动服务器:格式:python manage.py runserver ip:port注意:ip可以不写,不写代表本机ip端口号默认是8000python manage.py runserver说明:这是一个纯python编写的轻量级web服务器,仅仅在开发测试中使用这个
Admin站点管理:概述:内容发布:负责添加,修改,删除内容的公告访问配置Admin应用:在settings.py文件中的INSTALLED_APPS中添加'django.contrib.admin',这条默认是添加好的。创建管理员用户:在项目目录下执行 python manage.py createsuperuser依次输入账号名,邮箱,密码即可完成用户创建登陆:http://127.0.0.1:8000/admin/汉化:把project\settings.py中作如下设定:LANGUAGE_CODE = 'zh-Hans'TIME_ZONE = 'Asia/Shanghai'
管理数据表:修改 myAPP\admin.py 如下:from django.contrib import admin# Register your models here.from .models import Grades, Students# 注册admin.site.register(Grades)admin.site.register(Students)自定义管理页面:属性说明# 列表页属性list_display = [] # 显示字段设置list_filter = [] # 过滤字段设置search_fields = [] # 搜索字段设置list_per_page = [] # 分页设置# 添加,修改页属性fields = [] # 规定属性的先后顺序fieldsets = [] # 给属性分组 注意:fields与fieldsets不能同时使用属性示例:# 列表页属性list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']list_filter = ['gname']search_fields = ['gname']list_per_page = 5# 添加,修改页属性# fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']fieldsets = [("num",{"fields":['ggirlnum', 'gboynum']}),("base", {"fields":["gname", "gdate", "isDelete"]}),]关联对象:需求:在创建一个班级时可以直接添加几个学生class StudentsInfo(admin.TabularInline):# 可选参数admin.StackedInlinemodel = Studentsextra = 2class GradesAdmin(admin.ModelAdmin):inlines = [StudentsInfo]布尔值显示问题示例:class StudentsAdmin(admin.ModelAdmin):def gender(self):if self.sgender:return "男"else:return "女"# 设置页面列的名称gender.short_description = "性别"list_display = ['pk', 'sname', 'sage', gender,'scontend', 'sgrade', 'isDelete']list_per_page = 10admin.site.register(Students, StudentsAdmin)执行按钮位置:class StudentsAdmin(admin.ModelAdmin):...snip...actions_on_top = Falseactions_on_bottom = Trueadmin.site.register(Students, StudentsAdmin)使用装饰器完成注册:@admin.register(Students)class StudentsAdmin(admin.ModelAdmin):def gender(self):...snip...actions_on_top = Falseactions_on_bottom = True
视图的基本使用概述:在Django中,视图是对web请求进行回应视图就是一个python函数,在views.py文件中定义。定义视图:示例:在myApp\views.py中写入from django.shortcuts import render# Create your views here.from django.http import HttpResponsedef index(request):return HttpResponse("Sunck is a good man")配置url:方法一:path方法:修改project目录下的urls.py文件:from django.contrib import adminfrom django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('myApp.urls')),]在myApp应用目录下创建urls.py文件:from django.urls import path, includefrom . import viewsurlpatterns = [path('',views.index),]配置url:方法二:url方法:修改project目录下的urls.py文件:from django.contrib import adminfrom django.conf.urls import url,includeurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^', include('myApp.urls')),]在myApp应用目录下创建urls.py文件:from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^$', views.index),]
模板的基本使用:概述:模板是HTML页面,可以根据视图中传递过来的数据进行填充创建模板:创建templates目录,在目录下创建对应项目的模板目录(project/templates/myApp)配置模板路径:修改settings.py文件下的TEMPLATES下的'DIRS'为'DIRS': [os.path.join(BASE_DIR, 'templates')],定义grades.html与students.html模板:在templates\myApp\目录下创建grades.html与students.html模板文件模板语法:{{输出值,可以是变量,也可以是对象,属性}}{%执行代码段%}http://127.0.0.1:8000/grades写grades.html模板:<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>班级信息</title></head><body><h1>班级信息列表</h1><ul><!--[python04, python05, python06]-->{%for grade in grades%}<li><a href="#">{{grade.gname}}</a></li>{%endfor%}</ul></body></html>定义视图:myApp\views.pyfrom .models import Gradesdef grades(request):# 去模板里取数据gradesList = Grades.objects.all()# 将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器return render(request, 'myApp/grades.html', {"grades": gradesList})配置url:myApp\urls.pyurlpatterns = [url(r'^$', views.index),url(r'^(\d+)/(\d+)$', views.detail),url(r'^grades/', views.grades)]http://127.0.0.1:8000/students写students.html模板<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>学生页面</title></head><body><h1>学生信息列表</h1><ul>{%for student in students%}<li>{{student.sname}}--{{student.scontend}}</li>{%endfor%}</ul></body></html>定义视图:myApp\views.pyfrom .models import Studentsdef students(request):studentsList = Students.objects.all()return render(request, 'myApp/students.html', {"students": studentsList})配置url:myApp\urls.pyurlpatterns = [url(r'^$', views.index),url(r'^(\d+)/(\d+)$', views.detail),url(r'^grades/', views.grades),url(r'^students/', views.students),]需求:点击班级,显示对应班级的学生名字运行不正常https://www.bilibili.com/video/av17879644/?p=12Django流程梳理创建工程:执行 django-admin startproject 工程名创建项目:执行 python manage.py startapp 项目名称激活项目:修改 settings.py中的INSTALLED_APPS配置数据库:修改__init__.py文件修改settings.py文件中的DATABASES创建模型类:在项目目录下的models.py文件中创建生成迁移文件:执行python manage.py makemigrations执行迁移:执行python manage.py migrate配置站点:略创建模板目录/项目模板目录在settings.py中的TEMPLATES添加templates路径在工程目录下(project)修改urls.py在项目目录下创建urls.py使用他人Django代码需要的简易修改:
1.在settings.py中修改数据库名
2.在settings.py中修改数据库密码
3.删除由内向外文件(在对应目录里鼠标右键删除)
4.在数据库中创建对应第一步的数据库(自己在SQL中创建)
5.执行生成迁移文件
6.执行迁移
7.启动服务
8.浏览器测试Django模型Django对各种数据库提供了很好的支持,Django为这些数据库提供了统一的调用API我们可以根据不同的业务需求选择不同的数据库。配置数据库修改工程目录下的__init__.py文件import pymysqlpymysql.install_ad_MySQLdb()修改settings.py文件中的DATABASES开发流程配置数据库定义模型类:一个模型都在数据库中对应一张数据库表生成迁移文件执行迁移生成数据表使用模型类进行增删改查ORM概述:对象-关系-映射任务:根据对象的类型生成表结构将对象,列表的操作转换成SQL语句将SQL语句查询到的结果转换为对象,列表优点:极大的减轻了开发人员的工作量,不需要面对因数据库的变更而修改代码的问题定义模型模型,属性,表,字段之间的关系一个模型类在数据库中对应一张表,在模型类中定义的属性,对应该模型对照表中的一个字段定义属性:见下文创建模型类元选项在模型类中定义Meta类,用于设置元信息示例:class Meta:db_table = "students"ordering = ['id']db_table定义数据表名,推荐用小写字母,数据表名默认为项目名小写_类名小写ordering对象的默认排序字段,获取对象的列表时使用示例:ordering['id'] id按升序排列ordering['-id'] id按降序排列注意:排序会增加数据库开销模型成员类属性隐藏类属性objects:是Manager类型的一个对象,作用是与数据库进行交互当定义模型类时没有指定管理器,则Django为模型创建一个名为objects的管理器自定义管理器示例:定义stuObj管理器:stuObj = models.Manager()当为模型指定模型管理器,Django就不再为模型类生成objects模型管理器了。自定义管理器Manager类模型管理器是Django的模型进行与数据库交互的窗口,一个模型可以有多个模型管理器作用:向管理器类中添加额外的方法修改管理器返回的原始查询集通常会重写get_queryset()方法代码示例:class StudentsManager(models.Manager):def get_queryset(self):return super(StudentsManger, self).get_queryset().filter(isDelete=False)class Students(model.Moder):# 自定义模型管理器# 当自定义模型管理器,objects就不存在了stuObj = models.Manger()stuObj2 = StudentsManager()创建对象目的:向数据库中添加数据当创建对象时,django不会对数据库进行读写操作,当调用save()方法时才与数据库交互,将对象保存在数据库表中。注意:__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用。方法:在模型类中增加一个类方法,示例如下:class Students(model.Moder):...snip...@classmethoddef createStudent(cls, name, age, gender, contend,grade,lastT, createT, isD=False):stu = cls(sname=name, sage=age, sgender=gender,scontend=contend, sgrade=grade, lastTime=lastT, createTime=createT,isDelete=isD)return stu在自定义管理器中添加一个方法,示例如下:class StudentsManager(models.Manager):def get_queryset(self):return super(StudentsManager, self).get_queryset().filter(isDelete=False)def createStudent(self, name, age, gender, contend, grade, lastT, createT, isD=False):stu = self.model()# print(type(grade))stu.sname = namestu.sage = agestu.sgender = genderstu.scontend = contendstu.sgrade = gradestu.lastTime = lastTstu.createTime = createTreturn stu模型查询概述查询集表示从数据库获取的对象的集合查询集可以有多个过滤器过滤器就是一个函数,基于所给的参数限制查询集结果从SQL角度来说,查询集和select语句等价,过滤器就像where条件查询集在管理器上调用过滤器方法返回查询集查询集经过过滤器筛选后返回新的查询集,所以可以写成链式调用惰性执行创建查询集不会带来任何数据库的访问,直到调用数据库时,才会访问数据直接访问数据的情况:迭代序列化与if合用返回查询集的方法称为过滤器all():返回查询集中的所有数据filter():保留符合条件的数据filter(键=值)filter(键=值,键=值)filter(键=值).filter(键=值)   且的关系exclude():过滤掉符合条件的order_by():排序values():一条数据就是一个字典,返回一个列表get()返回一个满足条件的对象注意:如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常如果找到多个对象,会引发模型类MultipleObjectsReturned异常count():返回查询集中对象的个数first():返回查询集中第一个对象last():返回查询集中最后一个对象exits():判断查询集中是否有数据,如果有数据返回 True,否则返回 False.限制查询集查询集返回列表,可以使用下标的方法进行限制,等同于sql中的limit语句注意:下标不能是负数示例:studentsList = Students.stuObj2.all()[0:5]查询集的缓存概述:每个查询集都包含一个缓存,来最小化对数据库的访问在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结果。以后的查询直接使用查询集的缓存字段查询概述实现了sql中的where语句,作为方法filter(),exclude(),get()的参数语法:属性名称__比较运算符=值外键:属性名称_id转义:类似sql中的like语句like有关情况看我哥他%是为了匹配点位,匹配数据中的%使用(where like "\%")filter(sname__contains="%")比较运算符exact:判断,大小写敏感filter(isDelete=False)contains:是否包含,大小写敏感studentsList = Students.stuObj2.filter(sname__contains="孙")startswith,endswith:以value开头或结尾,大小写敏感以上四个在前面加上i,就表示不区分大小写iexact,icontains,istartswith,iendswithisnull,isnotnull是否为空filter(sname__isnull=False)in:是否包含在范围内gt大于,gte大于等于,lt小于,lte小于等于year,month,day,week_day,hour,minute,secondstudentsList = Students.stuObj2.filter(lastTime__year=2017)跨关联查询处理join查询语法:模型类名__属性名__比较运算符# 描述中带有‘薛延美’这三个字的数据是属于哪个班级的grade = Grades.objects.filter(students__scontend__contains='薛延美')print(grade)查询快捷pk代表的主键聚合函数使用aggregate函数返回聚合函数的值AvgCountMaxmaxAge = Student.stuObj2.aggregate(Max('sage'))maxAge为最大的sage。MinSumF对象可以使用模型的A属性与B属性进行比较from django.db.models import F,Qdef grades1(request):g = Grades.objects.filter(ggirlnum__gt=F('gboynum'))print(g)# [<Grades: python02>,<Grades: python03>]return HttpResponse("OOOOOOOo")支持F对象的算术运算g = Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)Q对象概述:过滤器的方法的关键字参数,条件为And模式需求:进行or查询解决:使用Q对象def students4(request):studentsList = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))return render(request, 'myApp/students.html', {"students": studentsList})只有一个Q对象的时候,就是用于正常匹配条件studentsList = Students.stuObj2.filter(~Q(pk__lte=3))~Q是取反定义属性概述:django根据属性的类型确定以下信息当前选择的数据库支持字段的类型渲染管理表单时使用的默认html控件在管理站点最低限度的验证django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列属性命名限制遵循标识符规则,且变量不能与Python保留字相同由于django的查询方式,不允许使用连续的下划线库定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下,为了方便使用,被导入到django.db.models中使用方式导入: from django.db import models通过 models.Field创建字段类型的对象,赋值给属性逻辑删除对于重要类型都做逻辑删除,不做物理删除,实现方法是定义idDelete属性,类型为BooleanField,默认值为False字段类型autoField一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中CharField(max_length=字符长度)字符串,默认的表彰样式是TextInputTextField大文本字段,一般超过4000时使用,默认的表单控件是TextareaIntegerField整数DecimalField(max_digits=None, decimal_places=None)使用Python的Decimal实例表示的十进制浮点数参数说明DecimalField.max_digits位数总数DecimalField.decimal_places小数点后的数字位置FloatField使用Python的float实例来表示的浮点数BooleanFieldTrue/False 字段,此字段的默认表彰控制是CheckboxInputNullBooleanField支持 Null, True, False 三种值DateField([auto_now=False, auto_now_add=False])使用Python的datetime.date实例表示的日期参数说明:DateField.auto_now每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”的时间戳,它总是使用当前日期,默认为 FalseDateField.auto_now_add当前对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为 False说明该字段默认对应的表单控件是一个TextInput.在管理员站点添加了一个JavaScript写的日历控件,和一个“Today”的快捷按钮,包含了一个额外的invalid_date错误消息键注意auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果TimeField使用Python的datetime.time实例表示的时间,参数同DateFieldDateTimeField使用Python的datetimedatetime实例表示的日期和时间,参数同DateFieldFileField一个上传文件的字段ImageField继承了FileField的所有属性和方法,但对上传的对象进行校验,确保它是一个有效的image字段选项概述通过字段选项,可以实现对字段的约束在字段对象中通过关键字参数指定null如果为True,Django将空值以NULL存储在数据库中,默认值为 Falseblanke如果为True,则该字段允许为空白,默认值为 False注意null是数据库范畴的概念,blank是表彰验证范畴的概念db_column字段的名称,如果未指定,则使用属性的名称db_index若值为 True,则在表中会为此字段创建索引default默认值primary_key若为 True,则该字段会成为模型的主键字段unique如果为 True,这个字段在表中必须有唯一值关系分类ForeignKey:一对多,将字段定义在多的端中ManyToManyField:多对多,将字段定义在两端中OneToOneField:一对一,将字段定义在任意一端中用一访问多格式对象.模型类小写_set示例grade.students_set用一访问一格式对象.模型类小写示例grade.studnets访问id格式对象.属性_id示例student.sgrade_id视图概述:作用:视图接收web请求,并响应web请求本质:视图就是python中的一个函数响应:响应过程:用户在浏览器中输入网址www.sunck.wang/sunck/index.html---网址--->django获取网址信息,去掉IP与端口号,网址变成:sunck/index.html---虚拟路径与文件名--->url管理器逐个匹配urlconf,记录视图函数---视图函数名--->视图管理,找到对应的视图去执行,返回结果给浏览器---响应的数据--->返回第一步:用户在浏览器中输入网址网页重定向错误视图404视图:找不到网页(url匹配不成功时返回)时返回在templates目录下定义404.html<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title></head><body><h1>页面丢失</h1><h2>{{request_path}}</h2></body></html>request_path:导致错误的网址配置settings.pyDEBUG如果为 True,永远不会调用404页面,需要调整为 False 才会显示ALLOWED_HOSTS = ['*']500视图:在视图代码中出现错误(服务器代码错误)400视图:错误出现在客户的操作JSON数据url配置配置流程:制定根级url配置文件settings.py文件中的ROOT_URLCONFROOT_URLCONF = 'project.urls'默认实现了urlpatterns一个url实例的列表url对象正则表达式视图名称名称url匹配正则的注意事项如果想要从url中获取一个值,需要对正则加小括号匹配正则前方不需要加'/'正则前需要加'r'表示字符串不转义引入其他url配置在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py中使用include方法project\urls.pyfrom django.contrib import adminfrom django.conf.urls import url,includeurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^', include('myApp.urls', namespace="myAPP")),]myApp\urls.pyfrom django.urls import path, includefrom django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^$', views.index, name="index"),]url的反向解析概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址解决:在使用链接时,通过url配置的名称,动态生成url地址作用:使用url模板视图函数定义视图:本质:一个函数视图参数:一个HttpRequest的实例通过正则表达式获取的参数位置:一般在views.py文件下定义HttpRequest对象概述:服务器接收http请求后,会根据报文创建HttpRequest对象视图的第一个参数就是HttpRequest对象django创建的,之后调用视图时传递给视图属性path:请求的完整路径(不包括域名和端口)method:表示请求的方式,常用的有GET,POSTencoding:表示浏览器提交的数据的编码方式,一般为utf-8GET:类似于字典的对象,包含了get请求的所有参数POST:类似于字典的对象,包含了post请求的所有参数FILES:类似字典的对象,包含了所有上传的文件COOKIES:字典,包含所有的cookiesession:类似字典的对象,表示当前会话方法is_ajax():如果是通过XMLHttpRequest发起的,返回 TrueQueryDict对象request对象中的GET,POST都属于QueryDict对象方法:get():根据键获取值,只能获取一个值www.sunck.wang/abc?a=1&b=2&c=3getlist()将键的值以列表的形式返回可以获取多个值www.sunck.wang/abc?a=1&b=2&c=3GET属性获取浏览器传递过来数据www.sunck.wang/abc?a=1&b=2&c=3urls.pyurl(r'^get1', views.get1),   #结尾不能加$,否则无法匹配views.pydef get1(request):a = request.GET.get('a')b = request.GET.get('b')c = request.GET.get('c')return HttpResponse(a + " " + b + " " + c)www.sunck.wang/abc?a=1&a=2&c=3urls.pyurl(r'^get2', views.get2),views.pydef get2(request):a = request.GET.getlist('a')a1 = a[0]a2 = a[1]c = request.GET.get('c')return HttpResponse(a1 + " " + a2 + " " + c)POST属性使用表单模拟POST请求关闭CSRF:project\project\settings.pyMIDDLEWARE = ['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',]示例:def showregist(request):return render(request, 'myApp/regist.html',)def regist(request):name = request.POST.get("name")gender = request.POST.get("gender")age = request.POST.get("age")hobby = request.POST.getlist("hobby")print(name)print(gender)print(age)print(hobby)return HttpResponse("regist")路径:url(r'^showregist/$', views.showregist),url(r'^showregist/regist/$', views.regist),页面:<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>注册</title></head><body><form action="regist/" method="post">姓名:<input type="text" name="name" value=""/><hr>性别:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女<hr>爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money">金钱<input type="checkbox" name="hobby" value="beauty">美女<input type="checkbox" name="hobby" value="Tesla">Tesla<hr><input type="submit" value="注册"></form></body></html>HttpResponse对象概述:作用:给浏览器返回数据HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建用法:不用模板,直接返回数据语句示例:return HttpResponse("Sunck is a good man")调用模板使用render方法原型:render(request, templateName[, context])作用:结合数据和模板,返回一个完整的HTML页面参数:request:请求体对象templateName:模板路径context:传递给需要渲染在模板上的数据属性content:表示返回内容charset:编码格式status_code:响应状态码304400content-type:指定输出的MIME类型方法init:使用页面内容实例化HttpResponse对象write(content):以文件的形式写入flush():以文件的形式输出缓冲区set_cookie(key, value, maxAge=None, exprise=None)delete_cookie(key):删除cookie如果删除一个不存在的cookie,就当什么都没发生子类HttpResponseRedirect功能:重定向,服务器端的跳转简写redirect(to)to推荐使用反向解析示例:from django.http import HttpResponseRedirectfrom django.shortcuts import redirectdef redirect1(request):# return HttpResponseRedirect('/redirect2')return redirect('/redirect2')def redirect2(request):return HttpResponse("我是重定向后的视图")子类JsonResponse返回Json数据,一般用于异步请求__init__(self.data)data 字典注意:Content-type类型为application/json状态保持http协议是无状态的,每次请求都是一次新的请求,它不记得之前的请求。客户端与服务器的一次通信就是一次会话实现状态的保持,在客户端或服务端存储有关会话的数据存储的方式cookie:所有数据存储在客户端,不要存储敏感的数据session:所有的数据存储在服务端,在客户端用cookie存储session_id状态保持的目的:在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据注意:不同的请求者之间不会共享这个数据,与请求者一一对应启用session:project\project\settings.pyINSTALLED_APPS    'django.contrib.sessions',MIDDLEWARE    'django.contrib.sessions.middleware.SessionMiddleware',使用session启用session后,每个httpRequest对象都有一个session属性get[key, default=None]    根据键获取session值clear()    清空所有会话flush()    删除当前会话并删除会话的cookie示例:# sessiondef main(request):# 取sessionusername = request.session.get('name', '游客')print(username)return render(request, 'myApp/main.html', {'username': username})def login(request):return render(request, 'myApp/login.html')def showmain(request):print("*****************")username = request.POST.get('username')# 存储sessionrequest.session['name'] = usernamereturn redirect('/main/')from django.contrib.auth import logoutdef quit(request):# 清除sessionlogout(request) # 方法1,推荐# request.session.clear() # 方法2request.session.flush() # 方法3return redirect('/main/')设置session过期时间set_expiry(value)request.session.set_expiry(10)  设置为10秒后过期如果不设置,2个星期后过期value设置为0代表关闭浏览器时过期value设置为None代表设置永不过期,不推荐Redis使用:略

  

转载于:https://www.cnblogs.com/GHzz/p/9971050.html

Django总叙(转)相关推荐

  1. 合并多个python list以及合并多个 django QuerySet 的方法

    尊重原文作者,该文转载于: http://www.yihaomen.com/article/python/533.htm 在用python或者django写一些小工具应用的时候,有可能会遇到合并多个l ...

  2. django项目之官网需求分析实现

    上一篇:Django总目录篇 点击跳转 目录 Django的魅力 按图需求分析 首页需求分析 核心团队 职员现状 在线视频 常见问题 关于我们 Djangoadmin后台管理 Django的魅力 Dj ...

  3. stay hungry stay foolish原文_弟子规原文+译文+注释

    总叙 原文弟子规,圣人训①:首孝弟(tì)②,次谨信③.泛爱众,而亲仁. 有余力,则学文. 注释①训:教导,教诲.②弟:通"悌",尊重兄弟姊妹.③信:言语真实,诚实. 译文< ...

  4. 小学语文毕业知识整理与复习题

    小学语文毕业知识整理与复习题 2011年07月23日 小学语文是义务教育阶段的一门基础学科,担负着全面提高学生语文素养的重任.经过六年的学习,大多数学生已具备了一定的语文素养,但是由于学生的个体差异, ...

  5. 浅谈数学、数学建模与人工智能(机器学习,深度学习)之间的关系?

    前言:         说来也巧合,我在大学里加入的第一个社团就是数学建模,各种各样的社团对我没有完全没有吸引力,什么舞蹈.爱心.创业.英语等,加入数学建模的原因有二:一是可以参加比赛,二是可以认识更 ...

  6. 网络安全与计算机网络基础知识

    总叙 首先网络实现通信和资源共享.分布处理,包括软件和硬件.其次iso网络7层和TCP/ip4层(没有物理层和数据链路层)协议,然而教学中用的五层,要了解每一层的协议.功能和是否可靠传输.再次IP地址 ...

  7. 中国石油大学远程教育《弟子规》

    在线考试(客观题) 单选题 (共10道题) 收起 1.(5.0分) 下列言语出自<弟子规>总叙的是( ). A.父母教 须敬听 父母责 须顺承 B.事虽小 勿擅为 苟擅为 子道亏 C.称尊 ...

  8. android安全分析师,乐固分析-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com...

    简介: 调试手机是Android 6.0的32位的手机.样本是自己写的一个demo小程序.加固时间为今年的12月中旬左右. Java层分析 壳的入口是MyWrapperProxyApplication ...

  9. 管理类联考——英语二——技巧篇——阅读理解——taiqi

    第一章 翻译技巧概述 一.词汇方面 (一)词义选择 大多数英语词汇是多义的,翻译时必须选择正确的词义.词义选择的方法有三:根据上下文和词的搭配选择根据词类选择.根据专业选择. (二)词义转换 在理解英 ...

  10. 转——《弟子规》原文及解说

    转自:http://www.dxgzs.com/zxmz/dzg.htm 〈总叙〉原文: 弟子规 圣人训 首孝悌 次谨信 泛爱众 而亲仁 有余力 则学文 解说: 至乐莫如读书,至要莫如教子. < ...

最新文章

  1. 1-uboot流程——概述
  2. 去除小圆点_去除li小圆点以及解决其空格问题
  3. 推荐几个常用的生物通路数据库
  4. 就这几个简单页面APP,这混小子要我10W块?!大家评评理!
  5. 必备的中国风PNG免扣元素点缀,尽显国潮韵味
  6. 小数点保留若干位小数 %.*f
  7. 80个超详细的Python入门实例
  8. 【JY】结构概念之(消能减震黏滞阻尼器)
  9. 数组中除一个元素外其他所有元素出现二或三次,找到只出现一次的元素
  10. Python实现psf2otf
  11. 华为云服务器怎么样?华为云服务器有什么优势?
  12. 带你手摸手搭建vuepress站点
  13. 前端文件上传,这8种场景
  14. 中南4月16号网络同步赛
  15. J2SE - super
  16. Python第三方生态库归类介绍
  17. 联邦学习((Federated Learning,FL)
  18. 在Windows Server 2008系统环境下无损调整分区
  19. 抓准痛点就能撬动市场!读屏时代的黑科技非它莫属了
  20. 小学认识计算机课件ppt课件,小学生认识计算机PPT教育课件.ppt

热门文章

  1. FindBugs-IDEA插件的使用
  2. Android 设计模式实战之关于封装计费代码库的策略模式详谈
  3. ndoejs后台查询数据库返回的值-进行解析
  4. Android复习之冒泡排序
  5. autocad.net QQ群:193522571 判断string中是否包含集合中所有的字符串
  6. RequireJS进阶(一)
  7. sprintf与swprintf
  8. 用Dezende解密zend后的php代码
  9. webpack 样式表抽离成专门的单独文件并且设置版本号
  10. ES6系列之let/const及块级作用域