学习完了前面7章,下面做一些改动看看到底会发生什么情况!可以是任何好奇或者觉得换种方式去写的情况,没有要求,没有规定。

1、创建第一个网页

第三章视图中 hello world,是不是显示的有点单调呀?没有平时看到的网页丰富

重新定义下hello world

from django.template.loader import get_template
from django.http import HttpResponse
import datetime
#from django.template import Context
from django.shortcuts import render_to_response
def hello(request):
    answer = '''
            <tilte><font color="#ff0000">hello,world!</font></title>#设置颜色显示红色
            </head>
    <h1><font color="#0080ff"><p align="center">This is just for a test !</p></font></h1> #设置蓝色居中,而且是一级head
    <font size=5>Donot be so shine!</font>#设置5号字
    <b><p>Can you believe me?</p></b>#设置为段落,且加粗显示
    <hr><blink>"yes" or "not"</blink></hr>#闪烁显示没有支持不成功,创建分隔线成功
    <table border=2>#设置显示成表格
    <tr><td>first#tr定义表格中的行
    <br>second</br>#简单拆行
    third
    </td></tr>
    </table>
        </body>
    </html>
    return HttpResponse(answer)

具体的就还有很多了,输入呀,框架,背景呀,至少证明可以做的更漂亮些,只是没有去实现而已。

2、动态网页

同样第三章中提到做一个动态网页,教程是对时间操作,按照用户输入来改变显示的结果。下面制作一个双色球随机生成网站。用户可以在进入或刷新网站后得到一注双色球号码

html文档:

{% extends "base1.html" %}
{% block title %}The shuang se qiu {% endblock %}
{% block content %}
<h1><font size=3>随机为您生成的号码如下:</font></h1>
<p><font color="0080ff">双色球的蓝色球是: <b>{{ blueball }}</b>.</font> </p>
<p><font color="#ff0000">双色球的红色球集合是:<b> {{ redballs }}.</b></font></p>
<h3>感谢您使用双色球随机生成工具,您可以使用<b>F5刷新</b>生成下一注号码</h3>
{% endblock %}

view函数:

def shuangseqiu(request):
    blue = [x for x in range (1,17)]
    red = [y for y in range (1,34)]
    blueball = random.choice(blue)
    redballs = []
    for n in range(1,7):
        redballs.append(red.pop(random.randint(0, (len(red)-1))))
    redballs.sort()
    return render_to_response('shuangseqiu.html', locals())

url文件:
(r'^shuangseqiu/$', shuangseqiu),

这样就ok了

效果如下图:

这样一个动态的网页显示也就完成了!

3.站点管理

在1.6版本的django举例中,还有个就是修改django的管理界面,可以自定义显示网站的提示内容

/python/django/practise/templates/admin$ 
在项目practise的templates目录下建立admin目录,然后新建一个 base_site.html文件,其内容如下:
{% extends "admin/base.html" %}
{% load i18n %}
{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
{% block branding %}
<h1 id="site-name"><b>{% trans "A test webpage of the project" %}</b></h1>
{% endblock %}
{% block nav-global %}{% endblock %}
h1 中间的文字便可以是网站的提示词了,页面可以修改为如下图,再也不用看着每次都是django admin了。

这样显示的就是“"A test webpage of the project"”,可以任意修改了。视乎显得更亲近和人性化了吧!

4. 联系站点管理员的实现

有没有觉得第七章表单中的联系站点管理员发送邮件没有实现有点失望呢?而且后面教程中并没有给出具体的界面和直观的感受,理解起来自然困难些了,没关系,下面通过练习和尝试来逐步实现

1)先实现邮件配置文件,在mysite/settings.py 文件中加入

#FOR EMAIL
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'julius.luck'
EMAIL_HOST_PASSWORD = 'XXX'
进行邮件服务器的配置,配置完成后进行测试
loongson@LOonux:~/python/django/practise$ python manage.py shell
Python 2.6.6 (r266:84292, Dec 27 2010, 22:07:44) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.mail import send_mail
>>> send_mail('a subject','here is the message','julius.luck@gmail.com',['dxx_study@163.com'],fail_silently=False)
>>> send_mail('text 1 a subject','here is the message 1','julius.luck@gmail.com',['dxx_study@163.com'],fail_silently=False)

返回1,再查看163邮箱,已经收到邮件,说明django已经可以发送邮件了;

2)配置url,编辑mysite目录下的urls.py文件,添加

from contact.views import contact
(r'^contact/$', contact),

3)在地址栏中输入..../contact

这样就得到了下面的框,填上自己的邮件内容,就可以提交了

这样我们就实现了第七章表单中提到的contact us界面了

但是一提交还会报错,

因为没找到要提交返回的url地址。所以下面就进行对应返回页面的编辑。

thanks.html

<title>Thanks</title> </head> <li>{{ thanks }}</li> </body> </html>

contact目录下的view.py 视图函数 thanks
def thanks(request):
    thanks = "Thanks for your suggestion !"
    return render_to_response('thanks.html', locals())

mysite目录下的url.py
    (r'^contact/thanks/$', thanks),

这样编辑保存后,再来进行submit,出现如下报错:

但是返回时CSRF认证失败了

这下麻烦了:

这个CSRF还真不好搞定,首先1.4版本和之前的版本有区别:Django新版已去掉这个模块 'django.middleware.csrf.CsrfResponseMiddleware' ,用不着再去添加了

按照上面的help提示,进行修改,确认使用了RequestContext,也不行;然后添加csrf_token,也不起作用;再后来干脆直接注释掉settings.py文件中的#'django.middleware.csrf.CsrfViewMiddleware',再运行就ok了,折腾了半天,尝试了很多种方法,实在不能启用CSRF成功,只有去掉。

去掉后点击提交submit,后自然重新打开了网页如下:

收到的邮件如下,看起来还不错,与python使用email发送邮件的格式要好看些。

这样向django管理员发送联系信息的工作基本就结束了。

什么是CSRF

它是一种跨站请求伪造,黑客可以利用这个攻击站点。而Django里的使用这个机制就是防止CSRF模式攻击,原理大致是当你打开页面的时候产生一个csrftokey种下cookie,然后当你提交表单时会把本地cookie里的csrftokey值给提交服务器,服务器判断只有有效的csrftokey值才处理请求。

5.表单书写view函数练习

”动手写一个简单的view函数来显示 request.META 的所有数据,做为一个练习,看你自己能不能把上面这个view函数改用Django模板系统来实现,而不是上面这样来手动输入HTML代码。“

这个是教程中的一个插语,怎么实现呢?

url.py中添加:

(r'^display_meta/$', display_meta),

修改display_meta视图函数为:
52 def display_meta(request):
 53     values = request.META.items()
 54     values.sort()
 55     return render_to_response( 'display_meta.html', {'values': values })

注意用的是render_to_response,而不是httpresponse。

编写display_meta.html:

{% extends "base.html" %}
{% block title %}display request meta items {% endblock %}
{% block content %}
<table>
{% for k, v in values %}
    <tr><td>{{ k }}</td><td>{{ v }}</td></tr>
{% endfor %}
</table>
{% endblock %}

注意上面html中对value值遍历的使用方法,并以表格方式输出;

这样我们就可以得到对应一样的显示了:

到目前为止,几个比较有疑惑的地方都已逐个解决了,前一阶段的练习到此结束!