Django框架视图介绍与使用详解


Posted in Python onJuly 18, 2019

本文实例讲述了Django框架视图介绍与使用。分享给大家供大家参考,具体如下:

视图

  • 视图:即一个python函数,可以叫 视图函数,或者简称 视图,定义在 应用/views.py 文件中。
  • 作用:接收并处理请求,调用M和T,响应请求(返回HttpResponse或其子类)
  • 每一个用户请求,都对应着一个视图(和url地址),由视图处理请求后,再返回html页面内容给浏览器显示。

URL配置及匹配

作用:建立url地址和视图函数的对应关系,当用户请求某个url地址时,让django能找到对应的视图函数进行处理。

配置url:

在应用下创建urls.py,然后在项目下的urls.py文件中包含进来:

# 项目下的urls.py
urlpatterns = [
  ...
  # 包含应用下的urls.py文件
  url(正则表达式, include('应用名.urls'))
]

在应用下的urls.py中,进行url请求的配置:

# 应用下的urls.py
urlpatterns = [
  # 每一个url配置项都需要调用url函数,指定两个参数
  # 参数1: 匹配url的正则表达式
  # 参数2: 匹配成功后执行的视图函数
  url(正则表达式, 视图函数名),
]

案例:

通过http://127.0.0.1:8080/app01/index地址,要调用视图函数index访问首页。则可配置如下(域名和端口号不需要配置,只需要配置 app01/index 部分):

在app01应用中创建urls.py文件,在该文件中配置url和视图函数的对应关系:

# app01.py
urlpatterns = [
  ...
  # 进入首页
  url(r'^index$', views.index),
]

在项目下urls.py中,把应用下的urls.py包含进来:

# Project01/urls.py
urlpatterns = [
  # 包含应用app01下的urls.py
  url(r'^app01/', include('app01.urls')),
]

url匹配流程

输入如下地址,访问首页:

http://127.0.0.1:8000/app01/index?aa=1&bb=xx

匹配流程:

Django框架视图介绍与使用详解

url配置规则 (针对应用下的url配置)

正则表达式 应使用 ^ 和 $ 严格匹配请求url的开头和结尾,以便匹配唯一的字符串

url匹配小结

  1. 域名、端口、参数不参与匹配
  2. 先到项目下的urls.py进行匹配,再到应用的urls.py匹配
  3. 自上而下的匹配
  4. 匹配成功的url部分会去掉,剩下的部分继续作匹配
  5. 匹配不成功提示404错误

视图函数

每一个请求的url地址,都对应着一个函数,叫视图函数,由视图函数处理请求后,再返回页面内容给浏览器显示。

应用/views.py 下,定义视图函数,示例:

from django.http import HttpResponse
# 必须有一个参数request
def index(request):
  """进入首页的视图函数"""
  # 处理完请求,返回字符串内容给浏览器显示
  return HttpResponse("Hello Python")

捕获URL中的值

问题:对于如下的url地址,如何捕获url上的两个值(代表新闻类别和页码),并传给视图函数处理?

输入如下地址:

# /show_news/新闻类别/页码
http://127.0.0.1:8000/show_news/1/2

解决: 把url中的需要获取的值部分,设置为正则表达式的一个组 django在进行url匹配时,就会自动把匹配成功的内容,作为参数传递给视图函数。

位置参数: url中的正则表达式组,和视图函数中的参数一一对应,函数中的参数名可以随意指定。

示例:

# 位置参数:新闻查看/新闻类别/第几页
url(r'^show_news/(\d+)/(\d+)$', views.show_news),
# 视图函数:views.py
def show_news(request, a, b):
  """显示新闻界面"""
  return HttpResponse("新闻界面:%s %s" % (a, b))

关键字参数: 在位置参数的基础上,对正则表达式分组进行命名:

?P<组名>

视图函数中参数名,必须和正则表达式分组名一致。

示例:

# 关键字参数:新闻查看/新闻类别/第几页
url(r'^show_news2/(?P<category>\d+)/(?P<page_no>\d+)$', views.show_news2),
# 视图函数:views.py
def show_news2(request, category, page_no):
  """显示新闻界面2"""
  return HttpResponse("新闻界面:%s %s" % (category, page_no))

错误视图

Django内置了处理HTTP错误的视图(在django.views.defaults包下),主要错误及视图包括:

  • 404错误:page_not_found 视图 (找不到界面)
  • 500错误:server_error 视图    (服务器内部错误)
  • 403错误:permission_denied 视图    (权限拒绝)

一、404错误及视图

url匹配失败后,django会调用内置的 page_not_found 视图函数,该视图函数会调用 404.html的模板进行显示。

开发阶段可以开启调试模式,但产品上线后,要关闭调试模式。关闭调试模式后,会显示一个标准的错误页面

# 关闭调试模式(开发模式)
DEBUG = False
# 表示允许哪些域名可访问当前网站
ALLOWED_HOSTS = ['*']

404错误界面可以自定义: 在项目templates目录面创建404.html,django找不到界面时,就会使用该界面了

二、500错误及视图

若是在执行视图函数时出现运行时错误,Django会默认会调用 django.views.defaults.server_error 视图,加载并显示 500.html 模板:

server error (500)

类似的,可以在项目的templates目录下,创建500.html来自定义该界面。

三、Django出错日志查看:

查看 Exception Type 以及 Exception Value

Django框架视图介绍与使用详解

查看 Traceback中的出错行

Django框架视图介绍与使用详解

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
浅谈Python中range和xrange的区别
Dec 20 Python
Python模拟随机游走图形效果示例
Feb 06 Python
Python 实现一行输入多个值的方法
Apr 21 Python
Django框架实现的普通登录案例【使用POST方法】
May 15 Python
django框架使用方法详解
Jul 18 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
Sentry的安装、配置、使用教程(Sentry日志手机系统)
Jul 23 Python
python3 中的字符串(单引号、双引号、三引号)以及字符串与数字的运算
Jul 18 #Python
使用django实现一个代码发布系统
Jul 18 #Python
python 将字符串中的数字相加求和的实现
Jul 18 #Python
TensorFlow实现简单的CNN的方法
Jul 18 #Python
windows上安装python3教程以及环境变量配置详解
Jul 18 #Python
Django 开发环境配置过程详解
Jul 18 #Python
解决Django中多条件查询的问题
Jul 18 #Python
You might like
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JS日历 推荐
2006/12/03 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
axios基本入门用法教程
2017/03/25 Javascript
angularjs封装$http为factory的方法
2017/05/18 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python跳出循环语句continue与break的区别
2014/08/25 Python
浅谈Python 对象内存占用
2016/07/15 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
对python中Json与object转化的方法详解
2018/12/31 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
python安装后的目录在哪里
2020/06/21 Python
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
请说出你所知道的线程同步的方法
2013/04/19 面试题
2014年数学教研组工作总结
2014/12/06 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫