大家好,又见面了,我是你们的朋友全栈君。
Python菜鸟教程第二十课之初始Django
1.Django简介
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则。
2.新建Django项目。
下面带大家来新建一个Django中最最最最最最最简单的项目
首先第一步,先安装一下Django库。windows键 R打开搜索,输入cmd,进入到windows命令行页面,输入:
代码语言:javascript复制pip install Django
当看到提示suceessful后,表示下载成功。
第二步,在Pycharm中新建Django项目。
在Pycharm左上角的菜单栏中,依次点击:File–>new project–>Django。在Location那一栏中可以选择项目存放的位置。在Project Interpreter里则是设置该项目的Python环境,我这里是选择已经有了的环境。
[外链图片转存失败(img-OCCRADnf-1566784388950)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565606417301.png)]
新建完成项目的目录列表如下:
[外链图片转存失败(img-8qfFGcvp-1566784388952)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565606740585.png)]
第三步,新建好之后,就可以开始编写我们的代码啦!
右键untitled,新建一个Python文件,命名为:views。
在views中输入代码:
代码语言:javascript复制from django.http import HttpResponse
def index(request):
return HttpResponse('欢迎来到jango的世界!')
在urls文件中找到urlpatterns的列表,在其中加入一句:
代码语言:javascript复制path('test/', index),
[外链图片转存失败(img-EWbJPj2R-1566784388952)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565607145063.png)]
到目前为止,这最最最最最最简单的Django项目代码部分已经完成了!。
第四步,接下来就需要我们去运行该项目了。
在PyCharm右下角选中Terminal,进入控制台,输入如图所示的代码后回车。
[外链图片转存失败(img-5iisj6Ym-1566784388953)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565607247660.png)]
代码语言:javascript复制python manage.py runserver#运行网页必须的代码,大家一定要记住!
如果大家一步一步按照上面的步骤来,会出现如下图所示的页面,说明大家的页面跟框架都已经搭建好了,点击蓝色的网址就可以了。
[外链图片转存失败(img-9Sd5xxRH-1566784388953)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565607398805.png)]
点击进入网页后,我们会看到一个火箭图片,然后在网址后面输入test,回车就能看到新建的网页了。
[外链图片转存失败(img-eM9Tjmcq-1566784388954)(C:UsershaseeAppDataRoamingTyporatypora-user-images1565607639595.png)]
到此为止,简单到不能称之为项目的Django网页已经完成了!
3.urls简介
在Django中,要访问一个自己新建的项目,最简单的也是不可缺少的步骤有三:设置urls、编写视图函数、通过浏览器访问。url即路由信息往往存在于urls.py文件中的urlpatterns列表中。在最开始的时候,jango往往使用的url来设置路由,现在通常由path来设置。
现在来简单介绍一下urls的几种用法。
3.1不传参配置路由
urls.py
urls中通常使用正则。
代码语言:javascript复制urlpatterns=[
url(r'^Hello/$', hello), #"Heoll"表示的是浏览器中输入的路径名(路由),而"hello"表示的则是该路径调用的视图函数。
]
views.py
代码语言:javascript复制#views.py中存放的是视图函数,在路由中可以设置访问其的视图函数。
def hello(request):
return HttpResponse( "Hello World" )
有了以上的信息,我们就可以通过浏览器来访问 http://127.0.0.1:8000/Hello。
3.2传递一个参数配置路由
urls.py
代码语言:javascript复制urlpatterns=[
url(r'^Hello/(. )/$', hello),#通过正则指定一个参数
]
views.py
代码语言:javascript复制def hello(request,param1):
return HttpResponse( "The param is : " param1)
有了以上的信息,我们就可以通过浏览器来访问 http://127.0.0.1:8000/Hello/china。
3.3传递多个参数配置路由
urls.py
代码语言:javascript复制urlpatterns=[
url(r'^Hello/p1(w )p2(. )/$', hello),#参照第二种情况,URL中通过正则指定两个参数:
]
views.py
代码语言:javascript复制def hello(request,param1,param2):
return HttpResponse(param1 param2)
有了以上的信息,我们就可以通过浏览器来访问 http://127.0.0.1:8000/Hello/p1chinap22019/.
从这里可以看出,视图的参数是根据URL的正则式,按顺序匹配并自动赋值的。虽然这样可以实现任意多个参数的传递,但是却不够灵活,URL看起来很混乱,而且由于是正则匹配,有些情况下容易出错。
3.4传递多个参数配置路由的第二个方法
urls.py
代码语言:javascript复制urlpatterns=[
url(r'^Hello/$' , hello),
]
views.py
代码语言:javascript复制 def hello(request,param1,param2):
p1 = request.GET.get(p1)
p2 = request.GET.get(p2)
return HttpResponse( "p1 = " p1 "; p2 = " p2)
有了以上的信息,我们就可以通过浏览器来访问 http://127.0.0.1:8000/Hello/?p1=china&p2=2019.
url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。 通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。
4.views.py
视图函数是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。无论视图本身包含什么逻辑,都要返回响应。这个视图函数代码一般约定是放置在项目或应用程序目录中的名为views.py的文件中。
http请求中产生两个核心对象:
1、http请求—->HttpRequest对象,用户请求相关的所有信息(对象)
2、http响应—->HttpResponse对象,响应字符串
视图函数中我们用到的request,就是HttpRequest对象。HttpResponse(),就是HttpResponse对象,它向http请求响应了一段字符串。
视图函数,就是围绕着HttpRequest和HttpResponse这两个对象进行的。
4.1HttpRequest对象
除非另有说明,否则所有属性都应视为只读(session除外)。
视图函数中的request参数与HttpRequest应该是有所区别的但是我暂时没办法给大家总结出来(有知道的小伙伴们可以在下面回复讨论!)。
我这里列出的只是request参数的属性。
属性名 | 描述 |
---|---|
request.path | 主要是用来获取访问文件路径 |
request.method | 获取请求中使用的HTTP方式(POST/GET) |
request.META | 请求信息 |
request.GET | 获取HTTP GET方式请求传参(字典类型) |
request.POST | 获取POST请求的数据(类字典对象) 请求体里拿值。 |
request.FILES | 包含所有上传文件的类字典对象 |
request.GET.get( name ) | 拿到GET请求里name的值,如果某个键对应有多个值,则不能直接用get取值,需要用getlist |
request.user | 是一个django.contrib.auth.models.User对象,代表当前登陆的用户 |
4.2HttpResponse响应对象
对于HttpRequest请求对象来说,是由django自动创建的,但是,HttpResponse响应对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse响应对象。
函数名 | 描述 |
---|---|
content | 表示返回的内容,字符串类型 |
charset | 表示response采用的编码字符集,字符串类型 |
status_code | 响应的HTTP响应状态码 |
content-type | 指定输出的MIME类型 |
4.21子类
django.http包含许多HttpResponse subclasses,用于处理不同类型的HTTP responses。
常见子类:
HttpResponseRedirect 301 HttpResponsePermanentRedirect 302 HttpResponseNotModified 304 HttpResponseBadRequest 400 HttpResponseForbidden 403 HttpResponseNotFound 404 HttpResponseNotAllowed 405
子类的使用:
代码语言:javascript复制def login2(request):
return HttpResponseNotFound(content="自定义响应")
4.3HttpResponseRedirect
HttpResponseRedirect:重定向一个url
使用方法: return HttpResponseRedirect( /路由名/ ) 注意是完整的路由不包括ip和端口
4.4render
render方法可接收三个参数,一是request参数,二是待渲染的html模板文件,三是保存具体数据的字典参数。render方法结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的HttpResponse对象。
代码语言:javascript复制def index(request):
return render(request, template_name,context)
参数: request: 用于生成响应的请求对象。 template_name:要使用的模板的完整名称,可选的参数 context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。
render方法主要是将从服务器提取的数据,填充到模板中,然后将渲染后的html静态文件返回给浏览器。这里一定要注意:render渲染的是模板。
4.5redirect
redirect的参数可以是: 一个模型:将调用模型的get_absolute_url() 函数 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称 一个绝对的或相对的URL,将原封不动的作为重定向的位置。 默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
示例:
将调用具体ORM对象的get_absolute_url()方法来获取重定向的URL,
代码语言:javascript复制from django.shortcuts import redirect
def my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object) # object指的是视图函数
传递一个视图的名称,可以带有位置参数和关键字参数;将使用reverse() 方法反向解析URL:
代码语言:javascript复制def my_view(request):
...
return redirect(some-view-name, foo= bar )
传递要重定向的一个硬编码的URL:
代码语言:javascript复制def my_view(request):
...
return redirect( ‘/some/url/’ ) # 完整的url
也可以是一个完整的URL:
代码语言:javascript复制def my_view(request):
...
return redirect( ‘https://www.baidu.com/’ )
默认情况下,redirect() 返回一个临时重定向。以上所有的形式都接收一个permanent 参数;如果设置为True,将返回一个永久的重定向:
301永久重定向是一种非常重要的“自动转向”技术,是网址重定向最为可行的一种办法。当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。
代码语言:javascript复制ef my_view(request):
...
object = MyModel.objects.get(...)
return redirect(object, permanent=True)
4.3拓展延伸
首先谈谈浏览器处理HttpRequest请求的流程:
一开始的时候,我们在浏览器中输入http://127.0.0.1:8000/Hello/(即发送了请求),这时浏览器会把这个请求交给Django处理。随后Django在我们的urls.py文件根据路由名查找,决定调用哪一个视图函数。确定好之后,调用该视图函数,并返回一个响应给浏览器给浏览器。根据以上的步骤,我们可以想明白为什么将HttpRequest对象作为第一个参数传视图函数,而视图函数必须返回HttpResponse对象。可以参考下图:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196050.html原文链接:https://javaforall.cn