Django学习第二天

Posted 奔跑吧小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django学习第二天相关的知识,希望对你有一定的参考价值。

一、Django的特点

创建Django项目:

django-admin startproject 项目名  (只是创建项目,后面的命令都是用以下命令)

创建Django应用:

python manage.py startapp 应用名

启动一个Django项目:

python manage.py runserver IP PORT  后面不加IP端口,默认是本机IP和8000端口

 

django在web框架里面是功能最全的一个框架,封装的功能多。目前市面上用得最多的就是django和flask

django是大而全。功能多,它没一个非常明确的需求,我们则要根据自己的需求来自己设定,所以自定义的内容很多。所有的东西都为你准备好了,直接用它的就好了。

flask是小而精。属于组装式的一个web框架,它没自己的ORM,但是它所有的功能都可以通过其它的插件组装起来,它就像积木一样,你想用哪部分就拼哪部分。所有的接口都组装好了,只要你自己拼凑就可以了

两个框架都各有优点,精通一个框架则自然会理通其它的web框架,各个框架都是相通的,只是语法不一样。django它给我们提供的功能,我们都不需要自己去自定义了,只要去django里调用就可以了。我们只需要学会怎么用django,不必去纠结它的底层实现的原理。不懂的可以去查阅django官方的中文文档,那个是django最全的文档。

二、url配置系统之语法格式

1、django项目结构说明

创建一个django项目产生的层级结构:

manage.py——Django项目里的工具,通过它可以调用django shell和数据库等

mysite    ——最上面的mysite是自定义的,它只是一个文件夹的名字。

       ——下面的mysite是一个具体的,因为它里面有__init__.py文件,那就可以供我们调用。它是一个全局性的内容。mysite里面的所有的文件都是与应用无关的一些文件,而是在应用之上的。每个应用里都有这些配置信息。

mysite里我们重点关心的就是setting.pyurls.py两个文件:

setting.py—— 包含了项目的默认设置,包括数据库信息,调试标志以及其它一些工作的变量

urls.py     —— 负责把url模式映射到应用程序

2、django应用结构说明:

app01:创建的django应用

Django应用里我们重点关心的就是models.pyviews.py

3、路由配置系统

我们要学的Django模型属于MTVC模型

M——model 模块:与数据库打交道的一个模块。

T——templates 模板:存放了所有的html文件。

V——view 视图:处理逻辑相关的。

C——controller 控制器(也叫路由分配系统):配置urls部分

 

路由分配系统controller:

Django里面的分发系统和控制器已经做好了,不像其它框架一样还得设计控制器。我们要做的是仅仅是学Django的对应关系,学会了对应关系,路由分发系统也就学会了。

打开pycharm,创建一个叫mysite的django项目,并创建一个名为blog的应用,创建好后,不写任何代码一样可以正常运行。在pycharm的终端输入python manage.py runserver 127.0.0.1:8000或直接按pychram上的快捷键即可启动项目

也可以对项目进行配置:在pycharm上找到

在浏览器里输入127.0.0.1:8080显示以下页面,这是项目的根目录,显示的内容是django给我们设定好的,告诉我们django项目已经启动起来了且可以正常工作。

 

4、写一个显示当前时间的小项目:

(1)配置路径

 

 (2)创建一个叫show_time的视图函数

 

(3)打开浏览器输入127.0.0.1:8080/timer/

 

直接输入127.0.0.1:8080会提示找不到页面

 

那是因为我们自己添加了一个路径,没添加之前,django会默认显示根目录自带的页面,添加路径后,django它会认为程序员设计自己的需求了,所以根目录就不会再有任何页面了。

所以我们应该在浏览器中输入127.0.0.1:8080/timer/则显示当前系统的时间了。

 

 

 5、路由分配系统(urls.py里的映射关系)

功能:客户端访问的url的路径(path)与视图函数一 一映射关系

 

语法格式:

urlpatterns = [

    url(正则表达式,views视图函数,参数,别名),

  ]

 6、写一个查阅博客的小程序:

要求:查阅2004年所有的博客

(1)配置路径:

一 旦匹配成功,就会调用视图函数这个函数,然后往视图函数里传入一个实参,这个实参是web服务器传的,它封装好后给调用者让它传进来的,相当于每个视图函数的形参就是请求信息的"request"t对象。

(2)创建一个视图函数

 补充:无论是返回render还是HttpResponse,它最终返回的就是HttpResponse字符串对象

(3)打开浏览器进行测试

 

7、正则表达式

2004前面的 ”^“ 表示以2004/开头进行匹配。

在浏览器中输入127.0.0.1:8080/2004/2003/2002等,只要是以2004开头的,不管后面有多少字符都能匹配得到。

如果只想匹配2004这个页面,则加上"$"

对于博客类的网站我们不可能用一个年份对应一个视图函数,我们会用一个视图函数处理所有年份,所以我们不能直接写死了年份,必须通过正则表达式来匹配出一个具体的年份。那么我们现在写一个可以通过一个视图函数来完成所有年份的查询的代码:

创建一个year_query的视图函数:

上图中视图的year_2004函数没有删除,所以我们在浏览器中输入的127.0.0.1:8080/2004/ 依然会显示2004,那是因为两个正则同时满足时,程序会按从上到下的顺序匹配,当匹配第一个成功时,则走第一个视图返回的信息,这一次请求也就结束了,就不会再走下面的了。

 

无名分组:

url(r\'^\\d{4}/$\',year_queary)中的\\d{4}是想传给视图函数的一个数字,只要想传给它做一个分组,在正则表达式里面通过小括号进行分组:url(r\'^(\\d{4})/$\',year_query),进行分组后,在浏览器中输入:127.0.0.1:8080/2007/会报错,那是因为只要我做了分组之后,这个url就会认为(\\d{4})这个内容是想传给视图year_query的一个参数的。也就是说它在调用的时候不光加上一个request还会把2007传进去,它会把分组的内容作为一个参数传给视图函,这个year_query函数里只有1个形参,但是我传了2007和request两个,所以会报错。

 

解决方法:在视图函数year_query里再加上一个形参:

def year_query(request,year):                     # year这个名字随便取,只要意思知道就行了。

    return HttpResponse(\'OK\')

这个year形参就是urls.py里的url(r\'^(\\d{4})/$\',year_queary)中的(\\d{4})传过来的。

 

这样就解决了,如下图:

三、url配置系统之分组

1、无名分组

继续上面的查问博客内容的项目:

要求:用户搜索的博客内容不仅要匹配到年份,还要匹配到月份。

最后在浏览器中输入:

 

总结:我们能够通过路径分组可以给视图函数传参数,这种方式叫做无名分组

 

2、命名分组

继续博客查阅项目:

如果把urls.py里的year_query函数中形参的位置顺序打乱,程序运行不会有任何问题,但是结果就有问题了:

 

 

显示的结果就乱套了:

 

因为我是按位置传参的,一 一对应的,所以才会乱套。解决方法就是用有名参数,解决方法如下:

?P<名字>来命名。(大写的字母P)

url(r\'^(?P<year>\\d{4})/(?P<month>\\d{2}$)\',year_query)

此时图函数里形参位置可以随意放,但是名字必须叫year和month,必须要一 一对应:

def year_query(request,year,month):

  pass

输出结果:

四、url配置系统之name参数

路由分配系统 urls.py的语法格式:

urlpatterns = [

        url(正则表达式 , views视图函数 , 参数 , 别名)

]

路由分配系统的语法中别名的作用:

1、写个注册的小项目:

 

 

action:

action是html语法form表单中所属性,表示当提交表单时,向何处发送表单数据。

显示结果:

 

但是点击提交后出现下面这种情况,这是查看post数据时,django自带的一种安全机制

解决方法:注释setting里的django安全措施——csrf

最后,再提交一次页面显示注册成功:

        

 2、别名功能

在实际工作中,公司因为业务的需要,比如某个项目下线了或某个页面更改了可能会更改到路径的名字的变化,路径名改了,所有与这个路径名相关的内容的名字都要改。为了避免这种事情,解决方法则需要用到路由分配系统urls.py中的别名功能了:

比如:要把用户注册的页面名reg改成regs,则所有与其相关的内容路径名都得改,这里我们要做的就是给urls.py里添加别名了,具体步骤如下:

(1)在视图函数后面加上name="自定义别名"

url(r\'^regs/\',reg,name="register")

(2)回到模板,找到相对应的html代码里,找到form表单的action属性,将这里改为{% url \'自定义的别名\' %}

action={% url \'register\' %}

(3)写好视图函数

 render方法渲染的是reg.html这个页面,当它在reg.html中发现{% url \'register\'%}这个别名的时候,它不会把这个内容直接发给用户,它会处理这个格式的别名,它会先到urls.py里找到一个别名叫register的别名,根据别名对应找到regs/这个路径,然后把更改过名字的/regs的这个路径再放到reg.html中进行处理,最后才发给用户。

 (4)最后在浏览器中打开输入127.0.0.1:8080/regs/,测试成功:

 

五、url配置系统之路由分发

 一个django项目可以有多个应用,单从功能上而言,它们是相互独立的。

1、配置网站根目录首页

 以上的项目由于没有给首页所以会报错

(1)先配置一个首页

(2)然后在urls.py中加入url(r\'^index/\',index)

此时根目录的首页就创建成功了。

2、路由分发                    重点 *****

如果把一个项目中的所有功能都写到全局的urls.py里,不但乱而且耦合性太强。若一个程序出现BUG,则会导致整个项目无法运行。所以我们就要用到路由分发的功能。具体操作如下:

什么是分发?用一个形象的比喻:

例如:

       一个班的作业要老师来检查,老师检查起来不但乱而且必须一个人一个人地对应,若有同学的作业做错了后,老师还得停下来为这位同学排错,其他同学必须等待,这样就很麻烦。

       为了解决以上问题,老师就安排了一些学习好的学生来当组长。每个组长都与各自的组员的一 一对应。假设有一个组里面的作业出现了问题,它不会影响其他组的正常检查。老师只需要和各个组长一 一对应即可。这个比喻就是分发。

       在django中,一个项目的全局的urls.py就不与每个用户一 一对应了,而是与每个应用中的urls.py一 一对应,每个应用中的urls.py与用户进行一 一对应。

具体操作如下:

(1)在django应用中创建urls.py

根据之前做的的项目中的应用名叫blog,我们在blog应用中创建一个叫urls.py的文件(相当于老师任命组长)

 

(2)让应用中的urls.py文件关联全局urls.py(路由分发)

接下来将这些“组长”— —对应“老师”全局的urls.py进行关联:

例如:给博客的项目写一个查阅功能。

 把实现查阅功能的代码写到blog应用的urls.py里,控制器urls.py里的注册、登陆这些与查阅功能的应用没有关系,所以还是在全局里面做配置

打开控制器urls.py添加这以下内容:

  第一行的调用模块命令中加上include

    from django.conf.urls import url,include

 

 

 

 (3)打开blog应用中的urls.py文件,将全局路由分发里的调用关系都拷贝进来

 

(4)最后在浏览器中进行测试,记住一定要加上blog应用的路径:

例如:127.0.0.1:8080/blog/2007/03

到这里MTVC中的C,也就是Controller(路由分配系统)已说完了。

六、视图函数之render方法

 在视图函数views中一定要弄清楚两个核心的对象:

  http请求对象:HttpRequest

  http响应对象:HttpReponse(" ")      # 实例的字符串对象

每一个视图有以上两个对象。

 

1、请求request

request.method——确认请求方式

request.get——存放get数据,以字典的方式存储

get请求数据的形式是把数据放在url后面?:a=1&b=2这种形式存储

reuqest.post——存放post数据,以字典的方式存储

...

还有一些request.file、request.url等这里暂时用不到就先不细说了。

2、返回对象的方法

HttpResponse(" ")——实例字符串对象

render(" ")——模板渲染

如果render方法只是返回一个页面,那么就把这个页面里的字符串读出来,然后封装到HttpResponse里起来作为一个实例对象return就OK了。它做的最重要的一件事就是渲染模板。

 

怎么才能把从数据库里取出的数据内容的变量嵌入到想返回的页面上呢?

用之前我做过的显示当前时间的例子:

我们把t这个变量通过%s占位符嵌入到页面里了。这里因为只返回一个简单的显示时间字符串,所以没有问题,如果要返回给用户一个大的页面,这个里面会有很多要嵌入的数据,这里就不能用这种方式了,而用且了以上这种方式,会造成前端开发人员与后端开发人员开发时间不能并行,必须得等后端开发人员把数据从数据库取出来处理之后再交给前端处理,这就大大增加了开发的成本。所以为了避免这种方式开发,Django提供了一个叫模板的东西。

django中什么是模板

答:模板是一种语言。

模板语言里只有两种语法:

(1)渲染变量{ {   } }

(2)渲染模板{%  %}

在模板语言里我们的目的只有一个——将后端的变量嵌入到html页面里面。

下面我们用一个例子来说明模板语言的作用与语法格式:

例:

做一个显示当前时间的项目升级版

 之前显示的时间的项目是用的是占位符的形式显示的,这次我要用模板语言来显示

(1)配置路径

 

 

 

redirect(" ")——跳转

前后端交互的基础数据就是字符串,render和redirect只是做了一些其它的处理,最终它们还是要通过字符串作为传播的介质。

 

(3)redirect("")

以上是关于Django学习第二天的主要内容,如果未能解决你的问题,请参考以下文章

django 学习第二天

django之第二天

Django 第二天 创建Django项目

Django TodayArchiveView 显示第二天的日期

django第二天

第二天 django apache