Django框架学习笔记
一、创建项目
1、setting配置
BASE_DIR是项目的根目录,而通过Path类调用的resolve()函数是python的标准库pythlib中的一个可以将相对路径转化为绝对路径的函数。
扩展:方法和函数的区别
@classmethod下定义的func属于方法,@staticmethod下定义的func属于函数;
而类class中定义的普通func要分是类调用
还是类对象调用
。
类调用:函数
类对象调用:方法
更改时区和语言:
2、启动项目
就直接在命令行启动:python manage.py runserver
指定ip和端口:
python manage.py runserver 9000
python manage.py runserver 0.0.0.0:9000
也可在pycharm中启动项目:
先在项目File-Settings-Project Interpreter中添加django项目的虚拟环境(我已提前创建好django的虚拟环境,并安装了django2.2):
再去Python interpreter中选中刚才添加的python.exe:
这样运行的端口是固定的。
二、路由
2.1、路由简介
如当用户在您的Web应用程序上发出页面请求时,Django会获取url中请求路径(端口之后的部分),然后通过urls.py文件查找与路径相匹配的视图,然后从model中获取数据并渲染到模板,返回HTML响应或404未找到的错误(如果未找到)。在urls.py中,最重要的是"urlpatterns"列表。这是定义URL和视图之间映射的地方。通过用户的请求路径去匹配urlpatterns中的path对象,如果匹配到了,就调用该path中的对应的视图函数views.xxx。
注意:
# 路有前缀不能以“/”开头, 否则在浏览器地址栏访问时也要加/
# 但是结尾的斜杠最好加上,加上后地址栏访问时不加/会重定向到加/后的地址
# 若结尾没有斜杠,则在地址栏访问时若加斜杠就报错了。
path对象的四个参数:
- 模式串:匹配用户请求路径的字符串
- 视图函数:匹配路径后调用的视图函数名
- kwargs:可选的额外传递的参数,字典形式
- 名称name:给路由命名,可在代码中进行反向解析。
2.2、动态url
在path中使用<参数名>表示所传参数,视图函数中的参数名必须和<>中参数名一致。参数可以是以下类型:
str:如果没有指定参数类型,默认是字符串类型。字符串参数可以匹配除/和空字符外的其他字符串
int:匹配O和正整数,视图函数的参数将得到一个整型值
slug:匹配由数字、字母、-和_组成的字符串参数
path:匹配任何非空字符串,包括/。
在re_path中,()部分是正则的组,django在进行url匹配时,就会自动把匹配成功的内容,作为参数传递给视图函数。
注意:如果有多个参数,path类型必须放到最后
三、视图
视图本质上是一个函数(类)。这个函数的第一个参数的类型是HttpRequest,它返回一个HttpResponse实例。
作用:接收并处理请求,调用模型和模板,响应请求(返回HttpResponse或其子类)
3.1、HttpRequest
服务器接收到http请求后,django框架会自动根据服务器传递的环境变量创建HttpRequest对象。
视图的第一个参数必须是HttpRequest类型的对象。
在django.http模板中定义了HttpRequest对象的API。
在request.py模块中找到HttpRequest这个类:
发现定义了很多属性,GET,POST,META等
还有很多方法如get_host()、get_full_path()、build_absolute_uri()等
各属性介绍:
GET:一个类似于字典的QueryDict对象,包含get请求方式的所有参数,也就是“?"后面的内容
POST:一个类似于字典的QueryDict对象,包含post请求方式的所有参数
COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串
SESSION:一个类似于字典的对象,表示当前的会话,只有当Django启用会话的支持时才可用
PATH:一个字符串,表示请求的页面的完整路径,不包含域名
method:一个字符串,表示请求使用的HTTP方法,常用值包括:GET、POST,
FILES:一个类似于字典的QueryDict对象,包含所有的上传文件
META:请求的请求头的源信息(请求头中的键值对)
encoding:字符编码
scheme:协议
获取请求中的json数据:
在Postman中发一个请求体是json格式的数据的POST请求:
好像用json.loads()可以直接将json格式的字节串转换为字典:
json传参时key要用双引号。
如果传的是form-data格式的数据:
key若是文本类型,则直接request.POST获取;
key若是File,则用request.FILES去获取。
注意:通过Postman发送请求需要CSRF认证,可以单独对list2这个视图进行CSRF豁免。
先导入:
from django.views.decorators.csrf import csrf_exempt
再在list2前面加装饰器@csrf_exempt
或者注释掉settings.py中的csef配置。
3.2、HttpResponse
每一个视图函数都必须返回一个响应对象,HttpResponse对象由程序员创建并返回。
属性和说明:
content:字节字符串
charset:字符编码
status_code:状态码
content_type:指定输出的MIME类型
1、不调用模板,直接返回内容
2、调用模板返回
一般用render函数返回,render只是HttpResponse的包装,还是会返回一个
HttpResponse对象
def render_to_response(template_name,context=None, content_type=None,
status=None, using=None):
template_name:模板名称。
context:一组字典的值添加到模板中。默认情况下,这是一个空的字典。
content_type : MIME类型用于生成文档。
status:为响应状态代码。默认值为200
3.3、 JsonResponse
JsonResponse是HttpResponse的子类,用于向客户端返回json数据。一般用于ajax请求。其content_type的缺省值是:application/json
3.4、重定向
HttpResponseRedirect是HttpResponse的一个子类,由于太长, 简化为redirect。
绝对路径重定向:
不带参重定向:
注意:这里的list前面的"/"一定要加,不然就重定向到/show/list
带参重定向:
反向定位:由应用名:name来确定路由,在urls.py中声明 app_name = App
也可以带参:如果参数有名字,必须使用关键字传参
3.5、错误视图
django内置了处理HTTP错误的视图,在django.views.defaults包下。
如url匹配失败后,django会调用内置的django.views.defaults.page_not_found()函数,该视图函数会调用404.html的模板进行显示。开发阶段可以开启调试模式,但产品上线后要关闭。在setting中设置:DEBUG = False 即可关闭。
关闭后在模板下面就可以自定义404.html,500.html页面了。
TypeError: 'set' object is not reversible
四、模板
4.1、模板渲染
第一步加载模板文件,生成模板对象:
obj = loader.get_template("xxx.html")
第二步渲染对象,生成html源文件(字符串):
res = obj.render({'name':'admin'})
return HttpResponse(res)
render加载和渲染一起执行,是一种快捷方式。
return render(request,'xxx.html',content={'name':'admin'})
render的前面两个参数必须传,即请求对象和模板名称,后面的参数有默认值None。
4.2、模板语法
django模板中包括两部分:变量和内置标签。变量会在模板渲染时被其值替代,内置标签负责逻辑控制。
变量:
直接用{{变量名 }}引用,列表元组直接用" . ",不可用索引。
字典.key
对象.属性 对象.方法名
五、模型
5.1、数据库配置
安装mysql客户端:pip install mysqlclient
settings中配置数据库连接:
提前在自己的mysql中添加数据库 “blog”。
然后启动项目,就会在应用里面自动更新出models.py了。在里面创建模型。
5.2、ORM
对象关系映射:Object Relational Mapping
ORM是通过使用描叙对象和数据库之间映射的元数据,自动生成sql语句,将程序中的对象自动保存到关系数据库中。
提高了开发效率,简化了开发流程,提高了系统的可移植性。但会增加学习成本。
注意:
一个模型类对应一个表;
对象对应一行记录;
属性对应字段;
每个模型类都必须继承django.db.models.Model
属性命名规则:
不能是python的保留关键字;
不允许使用连续的下划线,因为连续下划线在查询中会用到;
定义属性时需要指定字段类型;
主键一般不用自己定义,django会自动创建自增长主键列,如果你自己定义了主键,则django不会再自动生成主键。
字段:
AutoField:一个根据实际ID自动增长的InterField,自动生成,无需指定。
CharField:字符串,默认的表单样式是TextInput,必须指定max_length
TextField:大文本,对应longtext,一般超过4000使用,默认的表单控件是Textarea
IntegerField:整型
FloatField:用python的float实例来表示的浮点型
BOOleanField:true/false字段,此字段的默认表单控制是CheckboxInput
NullBooleanField:支持null、true、false三种值
DateField:使用python的datetime.date实例表示的日期,该字段默认对应的表单控件是一个TextInput
auto_now:每次保存对象都会刷新时间为当前时间
auto_now_add:显示第一次创建的时间
FileField:用于存储文件
UUIDField
:只能存储uuid
格式的字符串,通常用作主键类型。
URLField
:类似于CharField
,只能存储url格式的字符串,默认的最大长度max_length
为200。
2. Field常
约束:
db_column:指定此字段的数据库列的名称,如果没有给出,则使用字段名
db_index:如果为True,将为此字段创建数据库常规索引。
unique:唯一性
primary_key:主键
default:默认值
null:设置这个字段在数据库中存储时是否允许为空NULL,默认为False。注意,如果是False,而使用时又没有传递值,则Django会默认传递一个空字符串,如果是True,即允许为空,但是如果也没有传递值,则数据库中存储的值就是NULL,而不是空字符串了。
blank:设置这个字段在表单验证时是否允许为空,默认为False。这个参数与null的区别在于,null是对应于数据库存储的,而blank是对应于表单验证的。
无表迁移
此时数据库blog里面是没有表的。这时就要去做迁移。
生成迁移文件:
然后数据迁移:
此时再连接数据库blog查看多了很多表,user就是我的。
注意:
这两个命令默认情况下是作用于全局,也就是对所有最新更改的models或者migrations下面的迁移文件进行对应的操作,如果要想仅仅对部分app进行作用的话 则执行如下命令:
python manage.py makemigrations appname
python manage.py migrate appname
如果要想精确到某一个迁移文件则可以使用:
python manage.py migrate appname 文件名
以后修改字段或者新增表,修改完model.py后都要执行这两步实现迁移。
有表反向迁移
如果先在数据库中建一个表:
然后通过命令反向迁移:
python manage.py inspectdb > App/models_test.py
这样往往更方便。
手动修改数据库表结构之后,可直接在模型中作相应的修改,如添加一个字段等,无需迁移。
5.3、数据的增删改
感觉比之前用flask时的sqlalchemy简单些。
5.4、数据查询
要从数据库检索数据,首先要获取一个查询集(QuerySet),查询集表示从数据库获取的对象集合,它可以有零个,一个或多个过滤器。返回查询集的方法,称为过滤器,过滤器根据给定的参数缩小查询结果范围,相当于sql语句中where或limit。
注意:
在管理器上调用过滤器方法会返回查询集;
查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤;
惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库;
5.4.1. 返回查询集
5.4.2 返回单个值
下面这些方法后面不能再跟其他过滤方法,因为他们不返回查询集。
get() :只匹配一条数据,必须保证结果的唯一性,多个或者没有查询结果都会报错
User.objects.get(pk=1)
first()和last():返回查询集中的第一条或最后一条数据
count():返回查询集记录数目
exists():判断查询集中是否有记录,有则返回True,否则返回False
注意:一定要是查询结果集!
5.4.3 flter查询条件和统计查询
5.4.4 Q对象和F对象
Q对象解决的是filter查询条件之间的逻辑关系。实现与或非。
F对象用于比较表中的两个字段。
User.objects.filter(uid = F('gender'))
5.4.5 一对多
其中verbose_name和help_text的设与不设的体现:
5.5、 Django Admin 管理工具
django amdin是django提供的一个后台管理页面,通过Web来实现对数据的操作。
1、配置url
在根urls.py中默认有:
2、注册模型
在应用App的admin.py中写入:
3、创建管理员账号
通过命令行创建admin的账号:
python manage.py createsuperuser
启动项目,登录站点:
4、对项目进行个性化定制
其中的list_display列表展示的是app应用 的显示字段,如图:
fields元组:对App应用所能进行增加或修改的选项,主要是数据库表中的必传参数,非空必传