django基础(四)详解Views视图层
2019-01-27 01:07
726 查看
一、views基础知识
- 在django的MTV架构中,所谓视图层其实是进行业务处理(包括接受和响应http请求)的。整一个django的工作流程是这样子的:
功能可以总结为:
- 收到HTTP Request,执行URL映射
- 根据URL映射调用视图函数,调用模型层数据
- 渲染模版层网页文件,并生成HTTP Response返回。
二、基本URL映射功能
- urls.py需要包含的内容
- 每个django项目至少需要有一个urls.py,用于存储URL和视图函数的映射模式。
- url的解析过程是由django.conf.urls中的url模块来实现的。
- url映射基于正则表达式实现。
from django.conf.urls import url from django.contrib import admin from appname.views import viewfunctionName urlpatterns=[ url(r'^admin',admin.site.urls), url(r'^$','welcome',name="welcome") ]
- url映射中的正则表达式
- ^:托字符,表示首部
- $:表示尾部
- x | y:表示x或者y,例如request|reply,匹配request或者reply
- [xyz]:字符集,匹配字符集内的任意单个字符,例如这里匹配x、y或z中的一个。
- [^xyz]:不匹配字符集中的任意一个字符
- [ - ]:字符或者数字的范围,例如[0-9]表示匹配从0到9的数字
- {n}:匹配在它前面的单个字符n次,例如[0-9]{4}表示匹配长度为4个字符长度的数字
- .:匹配除了换行符之外的任意单个字符
- *:匹配在它前面的单个字符出现0次至任意多次的字符串,例如
*a
匹配""
、a
、aa
、aaa
、aaaa
等。 - .*:匹配除了换行符之外的任意字符串
- +:匹配在它前面的单个字符出现至少一次的字符串。
- \w:等价于[A-Za-z0-9]
- \W:等价于[^A-Za-z0-9]
- \d:等价于[0-9]
- \d+:等价于[0-9]+
- \D:等价于[^0-9]
例如:
- url(r
^$
,welcome):匹配http://127.0.0.1:8000/
- url(r
^index
,index):匹配http://127.0.0.1:8000/index1
、http://127.0.0.1:8000/index2
、http://127.0.0.1:8000/index3
以及http://127.0.0.1:8000/index
- url(r
^index$
,welcome):严格匹配http://127.0.0.1:8000/index
三、扩展URL映射功能
3.1 反向URL映射
我们经常需要在视图层和模版层中调用views函数以进行跳转。所以我们需要通过如下方式来达到这个目的:
- 通过name属性为url条目设置名称(urlname)。
- template中可以调用views函数(在template模板文件中通过
{% url 'urlname' %}
)这种方式来调用。 - views中也可以调用经过url映射的view函数,通过在views.py中用
reverse('urlname')
这种方法映射到其他对应的views函数。
案例1,在模版层调用views函数:
在urls.py中:
url(r'^$',welcome,name="welcomeurl")
url(r'^index',index,name="indexurl")
在welcome.html中若要调用index这个views函数
<a href="{% url'index' %}">进入主页</a>
案例2,在视图层调用其他views函数:
在urls.py中:
url(r'^list',list,name="listurl")
在views.py的其他函数中:
return HttpResponseRedirect(reverse('listurl'))
3.2 带命名参数的URL映射
基于命名传递给views函数/类。
语法规则:
?P<param_name>pattern,即参数名+匹配模式(正则表达式)。
案例:
在urls.py中:
url(r'^news/(?P<news_id>\d+)/$',InterDatailView.as_view())
在views.py中的InterDataView类中:
def get(self,request,news_id): news=Newsdb.objects.get(id=int(news_id)) #根据新闻id获取新闻内容
3.3 分布式URL映射
在大型项目中,会存在有多个app和第三方插件的情况。这时候应该分别为不同的app设置单独的urls.py文件并在主urls.py中引用,这样更加方便管理。
- 多个app共存的url映射配置:
- 新建一个工程。
- manage.py startapp app1;manage.py startapp app2。
- 为每个app中新建urls文件。
- 在外部的urls.py中引入各app的url映射文件
#urls.py urlpatterns = [ url(r`^admin/`,include(admin.site.urls)), url(r'^app1/',include('app1.urls')), url(r'^app2/',include('app2.urls')), ]
- 在settings.py中注册两个app
#settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app1', 'app2' )
- 建立共同引用的commontemplates与commonstatic文件
- 在setting中配置static与template
#settings.py HERE = os.path.dirname(os.path.dirname(__file__)) MEDIA_ROOT = os.path.join( HERE ,'media').replace('\\','/') MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(HERE,'static').replace('\\','/') STATIC_URL = '/static/' STATICFILES_DIRS = ( # add other path no app static os.path.join(HERE,'commonstatic/').replace('\\','/'), )
#settings.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [(os.path.join(BASE_DIR, 'commontemplates')),], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, },
- app/插件配置
url(r'audio/(?P<key>\w+)/$',vies.captcha_audio,name='captcha-audio')
四、视图函数
4.1 简介
- web服务器接受到用户发出的HTTP Request后,django执行url映射,然后把接下来的解析过程交给视图函数来处理。
- 视图函数大多数情况下会调用模型层的数据,并渲染Template网页,最终返回给用户(HTTP Response)
4.2 常用的视图函数
- render:返回html文件并传递参数,例如:
return render(request,"welcome.html",{'nowtime':nowtime})
- HttpResponse:直接返回内容,例如
return HttpResponse('<h1>你当前通过get方法访问该页面</h1>')
- HttpResponseRedirect:重定向到另外的页面,状态码是302,例如:
return HttpResponseRedirect(reverse("friendurl"))
,这里还用到了反向解析url映射。 - HttpResponseNotFound:返回404状态码。
- HttpResponseServerError:返回500状态码。
4.3 基于函数的写法
def friend(request): all_friend = friendDB.objects.all() if request.method == "POST": if request.POST['checkfriendname']: checkfriendname = request.POST.get('checkfriendname') checkfriend = friendDB.objects.filter(friendName=checkfriendname) return render(request, 'friend.html', {"thisfriend": checkfriend,"all_friend": all_friend}) else: deltefriend = request.POST.get('deltefriend') friendDB.objects.filter(friendName=deltefriend).delete() return render(request, 'friend.html', {"all_friend": all_friend}) else: return render(request, 'friend.html', {"all_friend": all_friend})
但实际上,若处理的页面中有多个可以产生POST请求的按钮,应该采用下面这种形式来处理。
4.4 基于类的写法
View类继承自django自带的基类base.View,自带get和post方法,可以直接重构,也可以封装更多的方法。
class learnHttp(View): def get(self,request): # requestInf = { # "path": request.path, # "method": request.method, # "GET": request.GET, # "POST": request.POST, # # "COOKIES": request.cookies, # # "FILES": request.files, # "META": request.META, # "user": request.user, # "session": request.session,} # # "raw_post_data": request.raw_post_data} return render(request,'learnDjango.html') def post(self,request): return render(request, 'learnDjango.html')
相关文章推荐
- Django基础,Day4 - views 详解
- Django基础,Day4 - views 详解
- 详解Django中类视图使用装饰器的方式
- 详解Python的Django框架中的通用视图
- django基础之数据库操作方法(详解)
- Django Class-based generic views 基于类的通用视图
- iOS基础控件-UITabBarController - 2 之UITabBarItem 详解,结合视图控制器和导航控制器的用法
- Django视图和URL配置详解
- 详解Django通用视图中的函数包装
- Django 学习小组:基于类的通用视图详解(一)
- django views视图函数返回值 return redirect httpresponse总结
- Django入门3:视图views
- DJango视图(views)和模版(templates)的使用
- 视图函数VIEWS基础及快捷方式
- Django2.0-views(7)-类视图,paginator,page
- 详解Django框架中的视图级缓存
- 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
- Django之views视图函数
- Django 框架之视图函数(Views)
- django template 基础(二)(在视图中使用模板)