一、views基础知识

  1. 在django的MTV架构中,所谓视图层其实是进行业务处理(包括接受和响应http请求)的。整一个django的工作流程是这样子的:

    功能可以总结为:
  • 收到HTTP Request,执行URL映射
  • 根据URL映射调用视图函数,调用模型层数据
  • 渲染模版层网页文件,并生成HTTP Response返回。

二、基本URL映射功能

  1. 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")
]
  1. 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匹配""aaaaaaaaaa等。
  • .*:匹配除了换行符之外的任意字符串
  • +:匹配在它前面的单个字符出现至少一次的字符串。
  • \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/index1http://127.0.0.1:8000/index2http://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中引用,这样更加方便管理。

  1. 多个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.pyHERE = 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.pyTEMPLATES = [{'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',],},},
  1. app/插件配置
url(r'audio/(?P<key>\w+)/$',vies.captcha_audio,name='captcha-audio')

四、视图函数

4.1 简介
  1. web服务器接受到用户发出的HTTP Request后,django执行url映射,然后把接下来的解析过程交给视图函数来处理。
  2. 视图函数大多数情况下会调用模型层的数据,并渲染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基础(四)详解Views视图层相关推荐

  1. vue-cli脚手架配置基础文件详解/新手入门必看

    vue-cli 脚手架中webpack 配置基础文件详解 需要Word版本 的小伙伴可以发我邮件2445478193@qq.com 一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的 ...

  2. Nmap扫描教程之基础扫描详解

    Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在 ...

  3. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  4. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

  5. python编程语法-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...

  6. python编程if语法-Python编程入门基础语法详解经典

    原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...

  7. python编程语法-Python编程入门——基础语法详解(经典)

    今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...

  8. 阿里云DDoS基础防护详解防护阈值黑洞时间详细说明

    阿里云DDoS基础防护是免费赠送给用户的,每台实例都可以免费试用DDoS基础防护,护云盾分享DDoS基础防护的详细说明,包括防护阈值.防护流量.安全信誉及黑洞时间等: DDoS基础防护详解 阿里云免费 ...

  9. python基础编程语法-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...

  10. python基础编程语法-Python编程入门——基础语法详解(经典)

    今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...

最新文章

  1. 基于YOLOv5的智慧工地安全帽检测(1)
  2. 4岁学编程,19岁创办以太坊,4年十亿身家!
  3. matlab求解集合覆盖问题,贪心算法实践之集合覆盖问题
  4. 进程的创建-fork
  5. cxf 本地wsdl_cxf使用wsdl文件生成代码
  6. 实时监控后台数据 vue_实时数据监控,快速掌握B站爆款视频热度走向
  7. FCOS: A Simple and Strong Anchor-free Object Detector
  8. IE浏览器各版本的CSS Hack
  9. 高保真原型、动画引导、用户登录、巡检任务、维保任务、用户中心、历史记录、帮助中心、清除缓存、任务抽检、扫描二维码、待办事项、账号设置、客服信息、交互说明、手机端、小程序、app原型、BIM信息综合管理
  10. Python基础笔记(四)
  11. java 次方_Java入门笔记0/3(基本数据结构)
  12. 代码雨大全(装逼或学习)--KuaiLe推荐
  13. jquery手机端带农历的万年历插件
  14. php主页备案号底部中间,如何获取公安备案号?如何将公安备案号放到网站底部?...
  15. PostgreSQL数据库——Pigsty
  16. 介绍一个牛人的机器学习PPT
  17. R语言使用geomtextpath包的coord_curvedpolar函数和coord_polar函数可视化时间表盘(time dial plate)
  18. mysql like json_Mysql之模糊查询
  19. 计算机cad理论试题,2017职称计算机AutoCAD试题「附答案」
  20. 2.9CSS table属性

热门文章

  1. 2021年中国电动自行车行业现状分析:产业特征明显,“新国标”促使行业发展更加规范化[图]
  2. 到底买苹果XS还是XR_iPhone XS和XR买哪个?10个理由告诉你XS更好,贵是有原因的!...
  3. 计算机一级学科大学排名,大学计算机排名(一级学科)
  4. matlab的发展历史,仿真的发展历程以及目前现状
  5. 用 Python j进行一次短视频音频创作
  6. 决定人生的三种成本:机会成本,沉没成本,边际成本
  7. 骨传导耳机靠谱吗?骨传导耳机是不是智商税?
  8. 搜索引擎的排序技术综述
  9. 搜索引擎学习之旅3 - 搜索引擎工作流程
  10. A-B(字符串问题)