设为首页 收藏本站
查看: 966|回复: 0

[经验分享] PYTHON框架之DJANGO

[复制链接]

尚未签到

发表于 2015-4-24 07:03:19 | 显示全部楼层 |阅读模式
PYTHON框架之DJANGO


  表单
  从Google的简朴的单个搜索框,到常见的Blog评论提交表单,再到复杂的自定义数据输入接口,HTML表单一直是交互性网站的支柱。本次内容将介绍如何用Django对用户通过表单提交的数据进行访问、有效性检查以及其它处理。 与此同时,我们将介绍HttpRequest对象和Form对象。
  从Request对象中获取数据
  在前面讲述View的函数时已经介绍过HttpRequest对象了,但当时并没有讲太多。 让我们回忆下:每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:



1 from django.http import HttpResponse
2
3 def hello(request):
4     return HttpResponse("Hello world")
  HttpRequest对象,比如上面代码里的request变量,会有一些有趣的、你必须让自己熟悉这些属性和方法,以便知道能拿它们来做些什么。 在view函数的执行过程中,你可以用这些属性来获取当前request的一些信息(比如,你正在加载这个页面的用户是谁,或者用的是什么浏览器)。
  URL相关信息
  HttpRequest对象包含当前请求URL的一些信息:
DSC0000.jpg
  在view函数里,要始终用这个属性或方法来得到URL,而不要手动输入。 这会使得代码更加灵活,以便在其它地方重用。 下面是一个简单的例子: 




DSC0001.gif
1 # BAD!
2 def current_url_view_bad(request):
3     return HttpResponse("Welcome to the page at /current/")
4
5 # GOOD
6 def current_url_view_good(request):
7     return HttpResponse("Welcome to the page at %s" % request.path)

  提交的数据信息
  除了基本的元数据,HttpRequest对象还有两个属性包含了用户所提交的信息: request.GET 和 request.POST。二者都是类字典对象,你可以通过它们来访问GET和POST数据。
  类字典对象
  我们说“request.GET和request.POST是类字典对象”,意思是他们的行为像Python里标准的字典对象,但在技术底层上他们不是标准字典对象。 比如说,request.GET和request.POST都有get()、keys()和values()方法,你可以用用 for key in request.GET 获取所有的键。
  那到底有什么区别呢? 因为request.GET和request.POST拥有一些普通的字典对象所没有的方法。 我们会稍后讲到。
  你可能以前遇到过相似的名字:类文件对象,这些Python对象有一些基本的方法,如read(),用来做真正的Python文件对象的代用品。
  POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。
  一个简单的表单处理示例
  通常,表单开发分为两个部分: 前端HTML页面用户接口和后台view函数对所提交数据的处理过程。 第一部分很简单;现在我们来建立个view来显示一个搜索表单:



1 from django.shortcuts import render_to_response
2
3 def search_form(request):
4     return render_to_response('search_form.html')
  
  这个view函数可以放到Python的搜索路径的任何位置。 为了便于讨论,咱们将它放在 books/views.py 里。
  这个 search_form.html 模板,可能看起来是这样的:





1
2
3     Search
4
5
6     
7         
8         
9     
10
11

  
  而 urls.py 中的 URLpattern 可能是这样的:





1 from mysite.books import views
2
3 urlpatterns = patterns('',
4     # ...
5     (r'^search-form/$', views.search_form),
6     # ...
7 )

  
  PS:我们直接将views模块import进来了,而不是用类似 from mysite.views import search_form 这样的语句,因为前者看起来更简洁。
  现在,如果你运行 runserver 命令,然后访问http://127.0.0.1:8000/search-form/,你会看到搜索界面。 非常简单。
  不过,当你通过这个form提交数据时,你会得到一个Django 404错误。 这个Form指向的URL /search/ 还没有被实现。 让我们添加第二个视图函数并设置URL:





1 # urls.py
2
3 urlpatterns = patterns('',
4     # ...
5     (r'^search-form/$', views.search_form),
6     (r'^search/$', views.search),
7     # ...
8 )
9
10 # views.py
11
12 def search(request):
13     if 'q' in request.GET:
14         message = 'You searched for: %r' % request.GET['q']
15     else:
16         message = 'You submitted an empty form.'
17     return HttpResponse(message)

  
  暂时先只显示用户搜索的字词,以确定搜索数据被正确地提交给了Django,这样你就会知道搜索数据是如何在这个系统中传递的。 简而言之:


  • 在HTML里我们定义了一个变量q。当提交表单时,变量q的值通过GET(method=”get”)附加在URL /search/上。
  • 处理/search/(search())的视图通过request.GET来获取q的值。
  需要注意的是在这里明确地判断q是否包含在request.GET中。就像上面request.META小节里面提到,对于用户提交过来的数据,甚至是正确的数据,都需要进行过滤。 在这里若没有进行检测,那么用户提交一个空的表单将引发KeyError异常: 



1 # BAD!
2 def bad_search(request):
3     # The following line will raise KeyError if 'q' hasn't
4     # been submitted!
5     message = 'You searched for: %r' % request.GET['q']
6     return HttpResponse(message)
  
  查询字符串参数
  因为使用GET方法的数据是通过查询字符串的方式传递的(例如/search/?q=django),所以我们可以使用requet.GET来获取这些数据。 前面介绍Django的URLconf系统时我们比较了Django的简洁的URL与PHP/Java传统的URL,通过刚才的介绍,我们知道在视图里可以使用request.GET来获取传统URL里的查询字符串(例如hours=3)。
  获取使用POST方法的数据与GET的相似,只是使用request.POST代替了request.GET。那么,POST与GET之间有什么不同?当我们提交表单仅仅需要获取数据时就可以用GET; 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST。 在这个搜索书籍的例子里,我们使用GET,因为这个查询不会更改服务器数据的状态。(如果你有兴趣了解更多关于GET和POST的知识,可以参见http://www.w3.org/2001/tag/doc/whenToUseGet.html。)
  既然已经确认用户所提交的数据是有效的,那么接下来就可以从数据库中查询这个有效的数据(同样,在views.py里操作): 





1 from django.http import HttpResponse
2 from django.shortcuts import render_to_response
3 from mysite.books.models import Book
4
5 def search(request):
6     if 'q' in request.GET and request.GET['q']:
7         q = request.GET['q']
8         books = Book.objects.filter(title__icontains=q)
9         return render_to_response('search_results.html',
10             {'books': books, 'query': q})
11     else:
12         return HttpResponse('Please submit a search term.')

  让我们来分析一下上面的代码:


  • 除了检查q是否存在于request.GET之外,我们还检查来reuqest.GET[‘q’]的值是否为空。
  • 我们使用Book.objects.filter(title__icontains=q)获取数据库中标题包含q的书籍。 icontains是一个查询关键字。这个语句可以理解为获取标题里包含q的书籍,不区分大小写。
  • 这是实现书籍查询的一个很简单的方法。 我们不推荐在一个包含大量产品的数据库中使用icontains查询,因为那会很慢。
  • 最后,我们给模板传递来books,一个包含Book对象的列表。 查询结果的显示模板search_results.html如下所示:





1 You searched for: {{ query }}
2
3 {% if books %}
4     Found {{ books|length }} book{{ books|pluralize }}.
5     
6         {% for book in books %}
7         {{ book.title }}
8         {% endfor %}
9     
10 {% else %}
11     No books matched your search criteria.
12 {% endif %}

  

随笔分类 - Python





PYTHON框架之DJANGO学习笔记(十五)




摘要: 表单 从Google的简朴的单个搜索框,到常见的Blog评论提交表单,再到复杂的自定义数据输入接口,HTML表单一直是交互性网站的支柱。本次内容将介绍如何用Django对用户通过表单提交的数据进行访问、有效性检查以及其它处理。 与此同时,我们将介绍HttpRequest对象和Form对象。从Req...阅读全文
posted @ 2014-10-18 16:31 尛鱼 阅读(145) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(十四)




摘要: Django站点管理(续·完) 本想昨天更新的,谁曾想昨天竟然是工作日!我就不吐槽昨天加班到十一点多了,需求增加无疑让我等蛋疼不已,忽而想起一首打油诗:明月几时有,把酒问群友。不知这次版本,今晚能出否。我欲推倒重构,又恐项目经理,深夜对我吼。增删改代码,好像没保存…深呼吸,看屏幕,泪在流。不应有恨...阅读全文
posted @ 2014-10-12 13:55 尛鱼 阅读(325) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(十三)




摘要: Django站点管理(续1) 上次介绍了Django的站点管理的一些基础知识,这次再来深入了解一下Django的站点管理。 Admin是如何工作的: 在幕后,管理工具是如何工作的呢? 其实很简单。 当服务启动时,Django从url.py引导URLconf,然后执行“admin.autodi...阅读全文
posted @ 2014-10-08 14:13 尛鱼 阅读(407) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(十二)




摘要: Django站点管理 十一转眼结束,说好的充电没能顺利开展,反而悠闲的看了电视剧以及去影院看了新上映的《心花路放》、《亲爱的》以及《黄金时代》,说好的劳逸结合现在回首看去,如果睡觉吃饭算是的话,那倒是挺多。是啊,十一过去了,也该收收心,开始准备过年了。啊,不对,准备工作。扯淡到此结束,接下来,开始...阅读全文
posted @ 2014-10-07 19:01 尛鱼 阅读(464) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(十一)




摘要: 话说上次说到数据库的基本访问,而数据库我们主要进行的操作就是CRUD,也即是做计算处理时的增加(Create)、读取(Retrieve)(重新得到数据)、更新(Update)和删除(Delete),俗称:增删改查。废话不多说,学习开始。 插入和更新数据 你已经知道怎么做了: 先使用一些关键参...阅读全文
posted @ 2014-09-28 09:17 尛鱼 阅读(489) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(十)




摘要: 又是一周周末,如约学习Django框架。在上一次,介绍了MVC开发模式以及Django自己的MVT开发模式,此次,就从数据处理层Model谈起。 数据库配置 首先,我们需要做些初始配置;我们需要告诉Django使用什么数据库以及如何连接数据库。假定你已经完成了数据库服务器的安装和激活,并且已...阅读全文
posted @ 2014-09-27 15:07 尛鱼 阅读(392) | 评论 (2) 编辑 |





PYTHON框架之DJANGO学习笔记(九)




摘要: 模型 之前,我们用 Django 建造网站的基本途径: 建立视图和 URLConf 。 正如我们所阐述的,视图负责处理一些主观逻辑,然后返回响应结果。 作为例子之一,我们的主观逻辑是要计算当前的日期和时间。 在当代 Web 开发中,主观逻辑经常牵涉到与数据库的交互。数据库驱动网站在后台连接数据库...阅读全文
posted @ 2014-09-20 21:38 尛鱼 阅读(433) | 评论 (2) 编辑 |





PYTHON数据结构之列表、元组及字典




摘要: 一位大牛Niklaus Wirth曾有一本书,名为《Algorithms+Data Structures=Programs》,翻译过来也就是算法+数据结构=程序。而本文就是介绍一下Python中内建的三种数据结构----列表、元组以及字典。 列表 列表是处理一组有序项目的数据结构,即你可以在...阅读全文
posted @ 2014-09-13 21:47 尛鱼 阅读(385) | 评论 (1) 编辑 |





PYTHON框架之DJANGO学习笔记(八)




摘要: 模板继承 到目前为止,我们的模板范例都只是些零星的 HTML 片段,但在实际应用中,你将用 Django 模板系统来创建整个 HTML 页面。 这就带来一个常见的 Web 开发问题: 在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码? 解决该问题的传统做法是使用服务器端的...阅读全文
posted @ 2014-09-07 13:39 尛鱼 阅读(107) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(七)




摘要: 标签eif/else {%if%}标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在{%if%}和{%endif%}之间的任何内容,例如:1 {% if today_is_weekend %}2 Welcome to the weeke...阅读全文
posted @ 2014-09-07 13:12 尛鱼 阅读(519) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(六)




摘要: 模板 上篇博文学习了动态视图,但是,视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python 代码之中。1 def current_datetime(request):2 now = datetime.datetime.now()3 html = "It is...阅读全文
posted @ 2014-08-31 11:42 尛鱼 阅读(386) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(五)




摘要: 第一个Django网页小结进来的请求转入/hello/。Django通过在ROOT_URLCONF配置来决定根URLconf。Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。如果找到匹配,将调用相应的视图函数。视图函数返回一个HttpResponse。Djang...阅读全文
posted @ 2014-08-31 10:49 尛鱼 阅读(152) | 评论 (0) 编辑 |





PYTHON学习之正则表达式初探




摘要: 正则表达式 正则表达式(或regexes) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。 这里是一些基本的语法。 符号 匹配 .(dot) 任...阅读全文
posted @ 2014-08-30 15:06 尛鱼 阅读(102) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(四)




摘要: 第一个基于Django的页面:Hello World 正如我们的第一个目标,创建一个网页,用来输出这个著名的示例信息:Hello world. 第一个视图 Hello world视图非常简单。 这些是完整的函数和导入声明,把它们输入到views.py文件:1 from django.http ...阅读全文
posted @ 2014-08-30 14:46 尛鱼 阅读(525) | 评论 (4) 编辑 |





PYTHON框架之DJANGO学习笔记(三)




摘要: 开始一个项目 第一次使用 Django,必须进行一些初始化设置工作。 新建一个工作目录,例如 D:\tool\python\Python27\workspace\djcode,然后进入该目录。 转到创建的目录,运行命令django-admin.pystartprojectmyfirstsite。...阅读全文
posted @ 2014-08-30 14:23 尛鱼 阅读(278) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(二)




摘要: 安装Django 我是在windows下安装的python以及django,下面的链接可以下载Django:http://www.djangoproject.com/download/ 1.下载 Django-1.6.6.tar.gz压缩文件 2.解压缩 3.在命令行下,进入Django的目...阅读全文
posted @ 2014-08-30 13:28 尛鱼 阅读(302) | 评论 (0) 编辑 |





PYTHON框架之DJANGO学习笔记(一)




摘要: Django历史: Django 是从真实世界的应用中成长起来的,它是由 堪萨斯(Kansas)州 Lawrence 城中的一个 网络开发小组编写的。 它诞生于 2003 年秋天,那时Lawrence Journal-World报纸的 程序员 Adrian Holovaty 和 Simon W...阅读全文
posted @ 2014-08-30 13:03 尛鱼 阅读(370) | 评论 (0) 编辑 |
  注意这里pluralize的使用,这个过滤器在适当的时候会输出s。
  以上就是这次的学习内容~






分类: Python

标签: Django

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60067-1-1.html 上篇帖子: python线程问题 下篇帖子: python的list操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表