Django框架学习笔记

一、创建项目

1、setting配置

BASE_DIR是项目的根目录,而通过Path类调用的resolve()函数是python的标准库pythlib中的一个可以将相对路径转化为绝对路径的函数。

 

扩展:方法和函数的区别

@classmethod下定义的func属于方法,@staticmethod下定义的func属于函数;

而类class中定义的普通func要分是类调用还是类对象调用

类调用:函数

类对象调用:方法

 
通过在命令行输入 python manage.py startapp App 安装应用App后,需要在settings.py中挂载一下,与项目建立联系。

 

更改时区和语言:

 

 

 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对象的四个参数:

  1. 模式串:匹配用户请求路径的字符串
  2. 视图函数:匹配路径后调用的视图函数名
  3. kwargs:可选的额外传递的参数,字典形式
  4. 名称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应用所能进行增加或修改的选项,主要是数据库表中的必传参数,非空必传

 

posted @ 2020-09-23 08:25  天青色wy  阅读(221)  评论(0编辑  收藏  举报