Django学习-随笔记录

本文详细介绍Django框架的核心组件,包括MVT模式、视图、URLconf、模版系统、模型等,阐述各部分功能及使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • django简介

模版template,视图views,模型models再加路由urls

  • djano安装

django的runserver开发服务器提示。不进行任何安全认证,不要部署在正式运行环境。

 

  • MVT开发模式

简述MVC开发模式:

  M:数据存取层

  V:界面显示,包括显示内容及显示布局等。

  C:根据用户输入决定如何处理及返回数据。

Django的MVC:M:模型models,V:views+template,C:urls。因C在django里自行处理,更关注与models,views,templates,所以被称为MVT模式。

 

 

  • 视图

视图的功能:通过url路由,响应从浏览器发来的请求。

可通过视图函数或通用视图类等方式实现视图。

视图函数:

  视图函数名不重要。

  函数的第一个参数为django.http.HttpRequest的一个实例,这是一个触发这个视图、包含当前web请求信息的对象。第一个参数必须是这个参数,参数名不重要。

  函数的返回是一个HttpResponse实例。

  • URLconf

松耦合原则。保证互换性的重要软件开发方法。修改一个不影响另一个。

  参数的校验交由view处理。

绑定URL和视图。

可理解成Django网站的目录,其本质是URL模式以及腰围该URL模式调用的函数间的映射表。

不同版本django间不同设置

urlpatterns = [url(‘^xxx/$’, view_name, name=’yy’)]

APPEND_SLASH:settings.py中的一个设置项,默认为True,表示对于请求的末尾没有’/’的,自动增加斜杠匹配。

通过正则表达式来匹配url路由,若是设置了自动加末尾’’/,则可使用’^xxx$’来严格匹配末尾无斜杠的url

动态内容:通过view处理数据并返回处理后的数据

动态url:通过通配符+()方式捕获数据,并按照顺序传给对应的view。也可以通过?P<name>{}的关键字方式捕获。每个捕获的参数将作为纯python字符串来发送。

另:每一个URLconf的模式都可以包含第三个数据:view视图函数的参数组成的字典。

   此方法可用于伪造捕捉到的关键字传递给视图函数,如当其他url也想使用这个视图函数,但是这个url格式中不包含视图函数的参数,那可以通过这个方式来伪造参数调用视图。当额外的字典参数与URL捕获的参数冲突时,以额外的字典参数为优先。另外,可以通过传入其他的视图函数,根据不同的逻辑进行不同的处理,典型的就是根据POST还是GET执行不同的视图函数。

  • 简单工作流程:

    运行Django服务器时,Django会在项目根目录下查找名为setting.py文件,该文件配置了Django的项目信息,其中一个ROOT_URLCONF配置项。

    Django去对应的urls.py中装载URLconf,然后根据列表顺序逐个匹配URLconfURLpatterns,直到某个正则表达式匹配。

    调用匹配的路由赌赢的view函数,并将HttpRequest对象作为第一个参数传递进去。

    view函数执行后,返回一个HttpResponse对象

    DjangoHttpResponsepython对象转换成对应的带有HTTP头和body数据的web Response,返回浏览器。

注:URLconf中的urlpatterns是可以相加的,整个框架关注的是一个名为urlpatterns的模块级变量,这个变量动态生成、还是分类罗列再相加,都可以。有助于项目管理。动态生成如根据不同设置及参数动态改变URLconf的行为。

通用视图:

  

  • 模版

模版可用于分离python代码及HTML,提高效率,更容易维护。

模版定义了占位符(模版变量)、模版标签。

变量{{  }}   两个大括号括起来的为变量,里面是变量名

模版标签{%  %}    两个大括号和百分号包起来,里面是模版标签名及对应逻辑

模版的渲染就是从context中获取值来替换模版变量,以及执行所有模版标签。

模版系统可以使用filter过滤器,通过Unix管道符“|”调用。默认的过滤器源码在/site-packages/django/template/defaultfilters.py

自定义模版过滤器:

    使用template.Library实例进行注册,python版本高于2.4可以用@register.filter(name='')进行注册,过滤器函数的第一个参数为输入变量,第二个参数为过滤条件({{ name | aa }},name将作为第一个参数传给aa,aa为注册时的name)

自定义模版标签:

    1.编写编译函数。编译函数即在HTML中遇到对应的模版标签时,所调用的templatetag函数,该函数接收两个采纳数,第一个是模版解析器对象,第二个是正在被解析的语句。正在被解析的语句即{%%}包起来的部分(字符串类型)。编译函数必须返回Node子类的实例。

    2.编写Node子类实例,用于在编译函数中return。该子类必须实现render方法。render函数接受一个上下文context对象。

    3.注册标签。即注册编译函数,仿照自定义模版过滤器,但是使用的是register.tag进行注册。

这样在HTML中经过{% load 模板库名 %},就可以使用对应的自定义过滤器和标签了。

Django的模版系统中遍历复杂数据结构的关键是句点字符(.)。复杂数据结构指listdictionary、自定义对象等。可以调用对象的属性、方法,字典的键值索引、列表下标索引等。

注意:对于方法调用,因为模版中句点字符调用的不带括号,所以只能调用不带参数的方法。按照字典类型键值查找、属性查找、方法调用、列表下标查找顺序查找,短路逻辑,找到就停止。可多级嵌套。

    安全问题,如果有一个A对象,A对象有一个delete函数,删除整个对象,如果在模版中使用了A.delete,则引发安全漏洞。需要设置delete.alters_data=True来防止发生。delete不会再模版中执行,只会静静错误退出。

    Django的模版属性中不允许执行python语句。例如不允许{% if A==B %}等表达式。

{% for %}标签:每一个for循环中,都有一个forloop模版变量。有一些提示循环进度信息的属性。

    forloop.counter:当前循环的执行次数的整数计数器,从1开始

    forloop.counter0:类似于上面,从0开始

    forloop.revcounter:表示循环中剩余项的整形变量。依次递减,初始为序列中项的总数。1为结束索引

    forloop.revcounter0:类似于上面,初始值为序列中总数-10为结束索引。

    forloop.first:第一次执行时为True,是一个布尔值。

    forloop.last:最后一次执行为True

    forloop.parentloop:指向当前循环的上一级循环的forloop对象的引用。用于嵌套循环。

模版加载目录:settings.py TEMPLATE_DIRS设置。

Django有两种方法进行模版加载:使用get_template()方法来获取template对象,或者select_template()。

Django可通过模版加载器来加载,使用什么加载器存放于设置TEMPLATE_LOADERS中,Django按照设置中的顺序使用模版加载器加载模版,直至找到匹配的模版。模版加载器比如从文件系统加载,从egg中加载,从应用程序的template文件夹中加载等。

使用render_to_response()来完成加载模版、上下文创建、模版解析、和HttpResponse创建。第一个参数必须为要使用的模版名称,第二个参数如果有,必须为创建上下文对象所使用的字典对象。

 

模版包含:{% include %}

模版继承:{% extends %}

    块:{% block %}{% endblock %}

RequestContext和Context对象:

   使用RequestContext,可以隐式的指明部分参数,如不想在Context中显示的指明user,password等数据时,可使用RequestContext。RequestContext是django.template的一个特殊子类。

  使用时,a = RequestContext(request, {'user':'aaa'}, processors = [proc])

        注:第一个参数都为Httprequest对象的实例,可选参数processors为context处理器,可自己定义,也可以使用Django提供的。通过设置TEMPLATE_CONTEXT_PROCESSORS的属性包含的context处理器,可以让对应的context默认包含对应的项。

模版转义:<转义成&lt;>转义成&gt;单引号'转义成&#39;双引号转义成&quot;&转义成&amp

    Django的模版转义是自动开启的,以保护不被跨域脚本攻击(XSS)。

     取消转义的方式:

        变量级:使用safe过滤器。{{ data | safe }}

        模块级:使用autoescape标签包含对应段,{% autoescape off %}  {% endautoescape %}   off为参数,也可为on,off表示阻止自动转义,on表示开启自动转义

  • 模型

Django默认支持postgreSQLMySQLSQLiteOracle数据库。

设置

  ‘ENGINE’:数据库连接所需适配器。

  ‘NAME’:数据库名称,需注意是否需要事先建立对应数据库。

  ‘USER’:连接数据库的用户名称

  ‘PASSWORD’:连接数据库用户的密码

  ‘HOST’:数据库所在服务器,若为MySQL,需注意是否为Unix socket连接指定的套接字。

  ‘PORT’:

注:Django约定数据库模型必须在app中,不得在project中。如果使用了Django的模型,那必须创建一个app

 

Django使用python代码来定义数据模型替换SQL编写的意义:

1.降低运行开销。使用python代码定义好数据模型,避免数据库自省来确认数据模型。数据库自省会带来数据库系统开销增加。

2.避免在SQL语言和python语言间来回切换编程思考。

3.将数据模型使用代码的方式表述出来,更容易了解数据层的变化

4.SQL对数据类型支持没有python代码来的多,比如email、url字段等,Django中有对应的描述字段,提高效率及降低代码复用。

5.若使用SQL语言,当数据库更新时,必须手动更新对应SQL。

注:Django再定义模型时,如果没有显示说明,会自动增加一个主键(id)字段

注意:

    Django不关心数据表中是否存在模型中未定义的列,但关心模型中存在数据表未定义的字段。

    Django不关心数据库中是否存在模型中未定义的表,但关心模型中定义了数据库中未存在的表。

外键:

Django模型可以通过get方式获取对象,注意外键。

    当通过外键获取值时,获取到的仍然是一个对象,而非对应值。

Django模型可以通过外键另一端的某一个对象反向追溯回来,需要增加"_set"方式,如Author.book_set.all()。book的作者外键是author。注:_set是一个QuerySet,可以实现数据过滤和分切。

  在模型设计时,如果允许输入空,则需要blank=true及null=true。null=true表示允许为null,blank=true表示允许为空。

当更改了数据库结构时,需要手动进入数据库进行手动更新,Django暂不支持对数据库结构的更改。

  通过模型的save方法保存时,若是对已存在的进行修改,则会更新所有字段,包括未修改的字段。这个操作可能引起竞态错误。若要单独更新一个字段数据,可通过Queryset(结果集)的update方法更新。

在查询时若是需要排序,通过order_by方式,加“-”表示逆序排列,也可通过模型中的class Meta的属性ordering=[]方式定义通用排序规则。(注:class meta类内嵌于模型的Meta类,可以设置一些与模型相关的选项。)

Django模型支持链式操作来进行过滤和排序等。Django也可以使用列表切片方式进行限制返回值数量。注:不支持负索引。

 

Django模型的manager:自定义manager是一种模型级功能。经常用来进行一些整表操作。

    模型的objects是一个特殊的属性,模型通过它来查询数据库,它是模型的manager。

    当需要增加额外的manager方法、或者修改manager返回的初始QuerySet时,可以考虑创建自定义manager。

    新增额外的manager方法:

    1.创建一个models.Manager的子类,命名自定。在子类中实现想要实现的功能方法代码。

    2.在定义模型时,将模型的objects属性更改为自定义子类实例,就可以实现自定义manager。

    修改初始QuerySet对象:

    1.继承models.Manager类,命名自定,在子类中重写get_query_set(self)方法,根据需要返回对应的QuerySet。

    2.在定义模型时,通过设置objects=models.Manager(),其他命名=Manager子类。这样做的原因是既提供了初始的manager,也提供了自定义manager的调用接口。

Django模型的自定义方法:行级方法,对一些特殊需求的模型实例有作用

    在模型中自定义方法,可通过模型对象实例进行调用完成特定的功能或返回。

Django模型的自定义SQL查询:可以结合自定义manager使用。

    1.导入django.db.connection并实例化

    2.获取游标对象,connection.cursor()

    3.使用游标执行原始SQL语句。使用游标.fetchone()或者游标.fetchall()获取返回记录集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值