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

[经验分享] Python+Django+SAE系列教程11-----request/pose/get/表单

[复制链接]

尚未签到

发表于 2015-4-25 08:27:43 | 显示全部楼层 |阅读模式
  表单request,post,get
  首先我们来看看Request对象,在这个对象中包括了一些实用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是怎样实现的:
  
  属性/方法

  说明

  举例

  request.path

  除域名以外的请求路径,以正斜杠开头

  "/hello/"

  request.get_host()

  主机名(比方,通常所说的域名)

  "127.0.0.1:8000" or"www.example.com"

  request.get_full_path()

  请求路径,可能包括查询字符串

  "/hello/?print=true"

  request.is_secure()

  假设通过HTTPS訪问,则此方法返回True, 否则返回False

  True 或者 False





  
  我们能够用一下方法调用就可以:

# GOOD
def current_url_view_good(request):
return HttpResponse("Welcome to the page at %s" % request.path)
  除此之外在request.META对象中还包含了一下信息
  HTTP_REFERER,进站前链接网页,假设有的话。 (请注意,它是REFERRER的笔误。)
  HTTP_USER_AGENT,用户浏览器的user-agent字符串,假设有的话。 比如:"Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
  REMOTE_ADDR clientIP,如:"12.345.67.89" 。(假设申请是经过代理server的话,那么它可能是以逗号切割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)
  用一下方法调用:
  # GOOD (VERSION 1)
def ua_display_good1(request):
try:
ua = request.META['HTTP_USER_AGENT']
except KeyError:
ua = 'unknown'
return HttpResponse("Your browser is %s" % ua)
# GOOD (VERSION 2)
def ua_display_good2(request):
ua = request.META.get('HTTP_USER_AGENT', 'unknown')
return HttpResponse("Your browser is %s" % ua)

以下我们来用曾经的样例做一个实验,改动我们之前的view.py文件,增加以下视图:

def request_test(request):
GetPath=request.path
GetHost=request.get_host()
GetFullPath=request.get_full_path()
GetIsSecure=request.is_secure()
try:
GetHTTP_REFERER = request.META['HTTP_REFERER']
except KeyError:
GetHTTP_REFERER = 'unknown'
try:
GetHTTP_USER_AGENT = request.META['HTTP_USER_AGENT']
except KeyError:
GetHTTP_USER_AGENT = 'unknown'
try:
GetREMOTE_ADDR = request.META['REMOTE_ADDR']
except KeyError:
GetREMOTE_ADDR = 'unknown'
  return render_to_response('request_test.html', locals())
然后,我们在制作一个模板,在template目录下,加入一个request_test.html文件:



  
  
  
      request对象中的内容
  
  
  
  标题内容
  Path:{{ GetPath }}
  Host:{{ GetHost }}
  FullPath:{{ GetFullPath }}
  IsSecure:{{ GetIsSecure }}
  HTTP_REFERER:{{ GetHTTP_REFERER }}
  HTTP_USER_AGENT:{{ GetHTTP_USER_AGENT }}
  REMOTE_ADDR:{{ GetREMOTE_ADDR }}
  
  
  
改动urls.py文件

  from django.conf.urls import patterns, include, url
  # Uncomment the next two lines to enable the admin:
  # from django.contrib import admin
  # admin.autodiscover()
  
  urlpatterns = patterns('',
      # Examples:
      # url(r'^$', 'Bidding.views.home', name='home'),
      # url(r'^Bidding/', include('Bidding.foo.urls')),
  
      # Uncomment the admin/doc line below to enable admin documentation:
      # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  
      # Uncomment the next line to enable the admin:
      # url(r'^admin/', include(admin.site.urls)),
      url(r'^hello/$', 'Bidding.views.hello'),
      url(r'^time/$', 'Bidding.views.current_datetime'),
      url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
      url(r'^hello_base/$', 'Bidding.views.hello_base'),
      url(r'^request_test/$', 'Bidding.views.request_test'),
  )
我们在浏览当中输入新的显示视图的路径:http://sunny090302.sinaapp.com/request_test/
就会看到一下的界面了,这里列出的就是整个request对象中的信息了:

DSC0000.jpg


除了主要的元数据,HttpRequest对象还有两个属性包括了用户所提交的信息: request.GET 和 request.POST。二者都是类字典对象,你能够通过它们来訪问GET和POST数据。POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。

了解了以上内容后,我们就能够制作一个简单的表单了,通常,表单开发分为两个部分: 前端HTML页面用户接口和后台view函数对所提交数据的处理过程。 第一部分非常easy;如今我们来建立个view来显示一个搜索表单(事实上就是一个空的函数,返回到一个表单的静态页):




def search_form(request):
return render_to_response('search_form.html')

在第三章已经学过,这个view函数能够放到Python的搜索路径的不论什么位置。 为了便于讨论,咱们将它放在 Users/views.py 里。从字面上理解,我们这就是要做一个关于用户信息的模块了。Users/views.py文件例如以下:

  # -*- coding: utf-8 -*-
  from django.shortcuts import render_to_response
  
  def search_form(request):
      return render_to_response('Users/search_form.html')
然后是这个 search_form.html 模板,之前我们讨论过模板也能够有结构的存放文件,这里为了更加清晰文件夹结构,我们决定把此模板文件放入template/Users文件夹:


查询用户



请再此输入用户姓名:






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

  from django.conf.urls import patterns, include, url
  
  
  # Uncomment the next two lines to enable the admin:
  # from django.contrib import admin
  # admin.autodiscover()
  
  urlpatterns = patterns('',
      # Examples:
      # url(r'^$', 'Bidding.views.home', name='home'),
      # url(r'^Bidding/', include('Bidding.foo.urls')),
  
      # Uncomment the admin/doc line below to enable admin documentation:
      # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  
      # Uncomment the next line to enable the admin:
      # url(r'^admin/', include(admin.site.urls)),
      url(r'^hello/$', 'Bidding.views.hello'),
      url(r'^time/$', 'Bidding.views.current_datetime'),
      url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
      url(r'^hello_base/$', 'Bidding.views.hello_base'),
      url(r'^request_test/$', 'Bidding.views.request_test'),
      url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'),
  )

我们把文件上传到sae后看效果会发现一个错误,这时由于我们少了一个__init__.py文件,他因该建立在Users\views.py文件的同一级,尽管的的内容是空的,我们以后会介绍这个文件的作用。

DSC0001.jpg


这里我们建立一个空的__init__.py,在Users文件夹中然后上传,就会看到一下的结果了:

DSC0002.jpg


当你通过这个form提交数据时,你会得到一个Django 404错误。 这个Form指向的URL /search/ 还没有被实现。 让我们加入第二个视图函数并设置URL:

urls.py:
  url(r'^search/$', 'Bidding.Users.views.search'),

# Users/views.py

  # -*- coding: utf-8 -*-
  from django.http import HttpResponse
  from django.shortcuts import render_to_response
  
  def search_form(request):
      return render_to_response('Users/search_form.html')
  
  def search(request):
      if 'q' in request.GET:
          message = '您搜索的keyword是: %r' % request.GET['q']
      else:
          message = '请输入您要检索的内容'
      return HttpResponse(message)

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

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

由于使用GET方法的数据是通过查询字符串的方式传递的(比如/search/?q=django),所以我们能够使用requet.GET来获取这些数据。 第三章介绍Django的URLconf系统时我们比較了Django的简洁的URL与PHP/Java传统的URL,我们提到将在第七章讲述怎样使用传统的URL。通过刚才的介绍,我们知道在视图里能够使用request.GET来获取传统URL里的查询字符串(比如hours=3)。

获取使用POST方法的数据与GET的相似,不过使用request.POST取代了request.GET。那么,POST与GET之间有什么不同?当我们提交表单只须要获取数据时就能够用GET; 而当我们提交表单时须要更改server数据的状态,或者说发送e-mail,或者其它不不过获取并显示数据的时候就使用POST。

接下来,我们发现上面的表单另一下几个问题:

1、假设我们输出的结果页面是静态的而非模板,这个我想您一定会自己改动,可是不要着急后面还有更简便的方法。

2、假设我们忘记输入keyword点击搜索尽管提示了对应的信息,可是我们还要点击退回button,进行再次搜索,最好能在本页面中显示。

3、在模板页面中,我们暴露了提交的视图“search”,这时在实际应用中是危急的。我们须要经过设置隐藏他。

以下我们就来改动表单:

search_form.html:



查询用户


{% if error %}
请输入您要检索的内容
{% endif %}

请再此输入用户姓名:





search_results.html:



查询用户结果页


一下是您查询的结果

查询条件为:包括"{{query}}"的人员信息




Users/views.py:

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from django.shortcuts import render_to_response
def search_form(request):
return render_to_response('Users/search_form.html')
def search1(request):
if 'q' in request.GET:
message = '您搜索的keyword是: %r' % request.GET['q']
else:
message = '请输入您要检索的内容'
return HttpResponse(message)
def search(request):
if 'q' in request.GET and request.GET['q']:
q = request.GET['q']
return render_to_response('Users/search_results.html',
{'query': q})
else:
return render_to_response('Users/search_form.html', {'error': True})
我们把代码上传,打开浏览器输入search的地址,就能够看到对应的内容了。http://sunny090302.sinaapp.com/search

DSC0003.jpg



      假设大家有后续能够再看看http://djangobook.py3k.cn/2.0/chapter07/对form类的介绍,由于在我工作的环境,一般这些都是交给美工做的,而且里面会用到非常多图片,form类的两个作用一是能够依据字段自己主动输出html的表单,二就是验证;第一种情况,一般交给美工,验证我们还是推荐使用js处理,这样避免数据的回发。所以在此就不做介绍了。














  

运维网声明 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-60406-1-1.html 上篇帖子: Python中何时使用断言 下篇帖子: python进阶八_警告和异常
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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