• Django Book 学习笔记(上)


    拜读了网上的Django Book,现在来总结一下吧。。。。。。

    一.Django的配置

           非常的蛋疼,由于Django的块组之间耦合度低,这既是它的优点,也是它的缺点。我在Ubuntu所配置的Django的开发环境是:Django1.6+PostgreSQL+Nginx+uwsgi+Memcached(缓存机制)。配置起来确实麻烦,但不得不说Nginx的反向代理真的非常好用,uwsgi作为Django和Nginx之间的桥梁。

           想知道怎么配置自己上网查吧。这里不多说了。

    二.Django的几条重要的命令

    >>>python manage.py shell  #启动交互界面
    >>>python setup.py install  #安装Django
    $:django-admin.py startproject mysite   #新建一个web项目
    >>>python manage.py runserver 端口号 #启动Django自带的服务器
    $:uwsgi -s :端口号 -w run_uwsgi(配置文件)  
    >>>python manage.py startapp books   #新建一个APP
    >>>python manage.py syncdb   #打印sql语句

    三.视图与URL设置

    hello 的demo:

    from django.http import HttpResponse
    
    def hello(request):
        return HttpResponse("Hello world")

    同时在urls.py作出相应的配置:

    from django.conf.urls.defaults import *
    from mysite.views import hello
    
    urlpatterns = patterns('',
        ('^hello/$', hello),
    )

    附录一下Django要用到的正则符号吧(不过还是自己先学一下正则表达式比较好):

    符号匹配
    . (dot) 任意单一字符
    d 任意一位数字
    [A-Z] AZ中任意一个字符(大写)
    [a-z] az中任意一个字符(小写)
    [A-Za-z] az中任意一个字符(不区分大小写)
    + 匹配一个或更多 (例如, d+ 匹配一个或 多个数字字符)
    [^/]+ 一个或多个不为‘/’的字符
    * 零个或一个之前的表达式(例如:d? 匹配零个或一个数字)
    * 匹配0个或更多 (例如, d* 匹配0个 或更多数字字符)
    {1,3} 介于一个和三个(包含)之前的表达式(例如,d{1,3}匹配一个或两个或三个数字)

    Django中请求视图(request)与响应视图(response)的过程大抵是这样:

    1. 进来的请求转入/hello/.

    1. Django通过在ROOT_URLCONF配置来决定根URLconf.

    1. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目。

    1. 如果找到匹配,将调用相应的视图函数

    1. 视图函数返回一个HttpResponse

       6.Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

    四.模板

    模板的调用并不复杂,但是关于模板的标签的内容有点多,这部分估计还是要看一下Django Book

    下面给出一个有用到模板继承以及最精简调用试图的demo:

    Bash.html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html lang="en">
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        <h1>My helpful timestamp site</h1>
        {% block content %}{% endblock %}
        {% block footer %}
        <hr>
        <p>Thanks for visiting my site.</p>
        {% endblock %}
    </body>
    </html>
    current_datetime.html
    {% extends "base.html" %}
    
    {% block title %}The current time{% endblock %}
    
    {% block content %}
    <p>It is now {{ current_date }}.</p>
    {% endblock %}
    #views.py中的current_datetime函数
    from django.shortcuts import render_to_response
    import datetime
    
    def current_datetime(request):
        now = datetime.datetime.now()
        return render_to_response('current_datetime.html', {'current_date': now})

    五.模型

    在将模型之前,先介绍一下Django不同于其他MVC框架的一种另外的思想:MTV思想。

    Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。 以下是 Django 中 M、V 和 C 各自的含义:

    • M ,数据存取部分,由django数据库层处理,本章要讲述的内容。

    • V ,选择显示哪些数据要显示以及怎样显示的部分,由视图和模板处理。

    • C ,根据用户输入委派视图的部分,由 Django 框架根据 URLconf 设置,对给定 URL 调用适当的 Python 函数。

    由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:

    • M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

    • T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

    • V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

    如果你熟悉其它的 MVC Web开发框架,比方说 Ruby on Rails,你可能会认为 Django 视图是控制器,而 Django 模板是视图。 很不幸,这是对 MVC 不同诠释所引起的错误认识。 在 Django 对 MVC 的诠释中,视图用来描述要展现给用户的数据;不是数据 如何展现 ,而且展现 哪些 数据。 相比之下,Ruby on Rails 及一些同类框架提倡控制器负责决定向用户展现哪些数据,而视图则仅决定 如何 展现数据,而不是展现 哪些 数据。

    两种诠释中没有哪个更加正确一些。 重要的是要理解底层概念。

    模型的内容有很多,还是自己看一下书吧。

    六.管理

    Django有自己的管理数据库的模块,类似与php的phpmyadmin。

    七.表单

    GET方法的demo:

    def search(request):
        error = False
        if 'q' in request.GET:
            q = request.GET['q']
            if not q:
                error = True
            else:
                books = Book.objects.filter(title__icontains=q)
                return render_to_response('search_results.html',
                    {'books': books, 'query': q})
        return render_to_response('search_form.html',
            {'error': error})

    POST方法的demo:

    from django.core.mail import send_mail
    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    
    def contact(request):
        errors = []
        if request.method == 'POST':
            if not request.POST.get('subject', ''):
                errors.append('Enter a subject.')
            if not request.POST.get('message', ''):
                errors.append('Enter a message.')
            if request.POST.get('email') and '@' not in request.POST['email']:
                errors.append('Enter a valid e-mail address.')
            if not errors:
                send_mail(
                    request.POST['subject'],
                    request.POST['message'],
                    request.POST.get('email', 'noreply@example.com'),
                    ['siteowner@example.com'],
                )
                return HttpResponseRedirect('/contact/thanks/')
        return render_to_response('contact_form.html',
            {'errors': errors})

    记得:对于成功的GET请求,我们应使用render_to_response返回;而对于成功的POST请求,我们应用HttpResponseRedirect做重定向,这是web开发的最佳实践。

     八.输出非html内容

    视图与MIME类型:

    视图函数只是一个以Web请求为参数并返回Web响应的Python函数。这个响应可以是一个Web页面的HTML内容,或者一个跳转,或者一个404错误,或者一个XML文档,或者一幅图片,或者映射到任何东西上。

    输出png图像:

    from django.http import HttpResponse
    
    def my_image(request):
        image_data = open('/home/dzhwen/swift.jpg')
        return HttpResponse(image_data,mimetype="image/png")

    输出CSV文件:

    import csv
    from django.http import HttpResponse
    
    # Number of unruly passengers each year 1995 - 2005. In a real application
    # this would likely come from a database or some other back-end data store.
    UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]
    
    def unruly_passengers_csv(request):
        # Create the HttpResponse object with the appropriate CSV header.
        response = HttpResponse(mimetype='text/csv')
        response['Content-Disposition'] = 'attachment; filename=unruly.csv'
    
        # Create the CSV writer using the HttpResponse as the "file."
        writer = csv.writer(response)
        writer.writerow(['Year', 'Unruly Airline Passengers'])
        for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):
            writer.writerow([year, num])
    
        return response

    输出pdf文件:

    from cStringIO import StringIO
    from reportlab.pdfgen import canvas
    from django.http import HttpResponse
    
    def hello_pdf(request):
        response = HttpResponse(mimetype='application/pdf')
        response['Content-Disposition'] = 'attachment; filename=hello.pdf'
    
        temp = StringIO()
        p = canvas.Canvas(temp)
    
        p.drawString(100,100,"Hello world.")
        p.showPage()
        p.save()
    
        return response

    九.会话,用户和注册

    好坏参半的Cookies

    也许你已经注意到了,cookies的工作方式可能导致的问题。 让我们看一下其中一些比较重要的问题:

    • cookie的存储是自愿的,一个客户端不一定要去接受或存储cookie。 事实上,所有的浏览器都让用户自己控制 是否接受cookies。 如果你想知道cookies对于Web应用有多重要,你可以试着打开这个浏览器的 选项:

     

    • 尽管cookies广为使用,但仍被认为是不可靠的的。 这意味着,开发者使用cookies之前必须 检查用户是否可以接收cookie。

     

    • Cookie(特别是那些没通过HTTPS传输的)是非常不安全的。 因为HTTP数据是以明文发送的,所以 特别容易受到嗅探攻击。 也就是说,嗅探攻击者可以在网络中拦截并读取cookies,因此你要 绝对避免在cookies中存储敏感信息。 这就意味着您不应该使用cookie来在存储任何敏感信息。

     

    • 还有一种被称为”中间人”的攻击更阴险,攻击者拦截一个cookie并将其用于另一个用户。 第19章将深入讨论这种攻击的本质以及如何避免。

     

    • 即使从预想中的接收者返回的cookie也是不安全的。 在大多数浏览器中您可以非常容易地修改cookies中的信息。有经验的用户甚至可以通过像mechanize(http://wwwsearch.sourceforge.net/mechanize/) 这样的工具手工构造一个HTTP请求。

     

    • 因此不能在cookies中存储可能会被篡改的敏感数据。 在cookies中存储 IsLoggedIn=1 ,以标识用户已经登录。 犯这类错误的站点数量多的令人难以置信; 绕过这些网站的安全系统也是易如反掌。
  • 相关阅读:
    在xcode5中修改整个项目名
    如何调试堆损坏
    My Life with Isaac Stern by Aaron Rosand
    Seagate 硬盘产地查询
    服务器返回 HTTP 500
    Exception code: 0xE0434352
    When curl sends 100-continue
    Milestone 不能卸载,修复 Counter 即可
    GE 遇到的 UAC 导致不能自动启动的问题
    关于 UAC,Mark Russinovich on the Future of Security
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3679235.html
Copyright © 2020-2023  润新知