当前位置: 首页 > Djangopython > django in action

django in action

h1. 安装


tar xzvf Django-*.tar.gz

cd Django-/*

sudo python setup.py install

完成后,利用如下代码来查看安装版本。

 Python |  复制 |? 
1
python
2
import django
3
django.VERSION

h1. 框架介绍


django提供了一套快速使用python开发web项目的技术框架。该框架是MVC模式。Model层是数据库层,负责对底层数据库的CRUD,支持ORM,所有数据库操作都是对对象的操作。同时也支持自定义sql的查询。

View为视图层,包括了视图函数和web页面的展现。

Control为控制层,实现了request,response,session等中间件来拦截过滤请求,并提供了url映射。

h2. Model层

django可以把自定义的models类自动生成为数据库表。

每一个model最好有一个对应的Meta,制定对应的table名,如果不加入,则会默认访问”应用名_类名”为对应的数据库名称。

 Python |  复制 |? 
1
class Book(models.Model):
2
    id = models.AutoField(primary_key=True)
3
    title = models.CharField(max_length=100)
4
    authors = models.CharField(max_length=100)
5
    publisher = models.CharField(max_length=100)
6
    publication_date = models.DateField()
7
    class Meta:
8
        db_table = "t_book"

 

如果已经定义了models,则将该应用对应的appName,本例中为’DjangoProject.buss’,添加到settings的

INSTALLED_APPS = (‘DjangoProject.buss’,)中。

执行python manage.py validate可以对models进行校验。

执行python manage.py syncdb 对settings.py中设定的数据库进行建表操作。

[django中的数据库操作]

h2. View层

模板的加载,需要在settings中增加如下信息。

其中所有配置的路径都必须是绝对地址,而不是相对地址,所以我们引入了os,path来处理相对地址的情况:

 Python |  复制 |? 
1
TEMPLATE_DIRS = (
2
    os.path.join(os.path.abspath(os.path.dirname(__file__)), 'templates'),
3
)

from django.template import Template

模板类,传入html代码,生成模板对象

from django.template.context import Context

Context是一组变量值对,用于给模板传递参数。

from django.template.loader import get_template

用于在settings配置的路径中找到对应名称的模板。

对于任意一个视图函数,均要有django.http.HttpResponse的输出。

也可以返回 django.http.HttpResponseRedirect,django.shortcuts.render_to_response。这2者均返回reponse对象。

django还封装了许多response。比如404,403,500等。

403:HttpResponseForbidden

404:HttpResponseNotFound

等。可以查看django.http./__init_/_.py

h2. URL映射

跟目录下的urls.py用于url路径与视图函数的绑定。

url路径由正则表达式来进行处理:

r’^test/$’,其中r表示后面的是一个字符串。test前不用增加/,django自动替你完成这部分工作。

/^表示字符串头部匹配,$表示字符串尾部匹配。

如果程序希望通过/test/或者/test均能访问到该视图函数的话,则有2种方式:

r’^test/?$’ 或者 在工程目录中的settings中增加APPEND_SLASH=True。系统会自动重定向。

在url映射中,需要注意的:

一个url例子:(r’^article/$’,getArticle)

当一个url的映射,需要出现在工程中的很多地方的时候,如果每次都直接进行调用HttpResponseRedirct(“/article/”),如果

url名字进行了修改,这就需要工程中的所有地方都需要修改,或者页面上也有这样的链接,那样的工作将是非常繁重的。

取而代之的方式:

url(r’^article/$’,getArticle,name=”article_list”)

在函数视图中,如果用到该链接,使用reverse(”article_list”)

而在模板中,使用

{%url article_list%}

的方式引入到工程中。

当某链接中存在正则表达式传值的方式,比如:

url(r’^article/(?P/d{4})/(?P/d{1,2})/$’,'getArticle’,name=”article_list” )

则再模板中{%url article_list 2010 ,02%},

在视图中reverse(”article_list”,kwargs={“year”:2010,”month”:02})

h1. admin管理


h2. 在settings中设置:

 Python |  复制 |? 
01
LANGUAGE_CODE = 'utf-8'
02
MIDDLEWARE_CLASSES = (
03
    'django.middleware.common.CommonMiddleware',
04
    'django.contrib.sessions.middleware.SessionMiddleware',
05
    'django.middleware.csrf.CsrfViewMiddleware',
06
    'django.contrib.auth.middleware.AuthenticationMiddleware',
07
    'django.contrib.messages.middleware.MessageMiddleware',
08
)
09
INSTALLED_APPS = (
10
    'django.contrib.auth',
11
    'django.contrib.contenttypes',
12
    'django.contrib.sessions',
13
    'django.contrib.sites',
14
    'django.contrib.messages',
15
    'DjangoProject.buss',
16
    'django.contrib.admin',
17
)

h2. 在models所在包中增加admin.py

 Python |  复制 |? 
1
from DjangoProject.buss.models import Book
2
from django.contrib import admin
3
class BookAdmin(admin.ModelAdmin):
4
    list_display = ['title', 'publisher', 'publication_date']
5
    list_filter = ['publisher', 'publication_date']
6
    ordering = ['-publication_date']
7
    search_fields = ['title']
8
admin.site.register(Book, BookAdmin)

 

h2. 在urls中增加

 Python |  复制 |? 
1
from django.contrib import admin
2
admin.autodiscover()
3
在patterns中增加
4
(r'^admin/(.*)', admin.site.root),

h1. RequestContext


RequestContext处理器用来向页面模板传递公共变量。

可以包含多个processor。

一般配置为:

在settings中

 Python |  复制 |? 
1
TEMPLATE_CONTEXT_PROCESSORS = (
2
    'django.core.context_processors.auth',
3
    'django.core.context_processors.debug',
4
    'django.core.context_processors.i18n',
5
    'django.core.context_processors.request',
6
    '自定义',
7
)


其中auth处理器中包括user,message信息。页面使用{{user}}。

request包含了当前请求中的信息。{{request.sesison}}等定义在request中的变量。

支持自定义处理器,非常简单,传入一个request,传出一个dict就ok了!

在视图函数中调用的时候,只需要扩展下以前的方法就可以了!

 Python |  复制 |? 
1
render_to_response("login.html",{"otherparams":params}
2
                              ,context_instance=RequestContext(request))


处理器简单示例

 Python |  复制 |? 
1
就是将settings中的一个常量,放入到模板中,统一使用
2
def resourcePath(request):
3
    return {"resourcePath":settings.RESOURCEPATH}


h1. Django的Session,Cookie管理


cookie的设置

 Python |  复制 |? 
1
response.set_cookie(settings.KX_SESSION_COOKIE_NAME,
2
                        newSessionId,expires=Constants.COOKIE_EXPIRES,
3
                        domain=settings.SESSION_COOKIE_DOMAIN


session的超时时间设置

settings中

SESSION_COOKIE_AGE=60*30 30分钟。

SESSION_EXPIRE_AT_BROWSER_CLOSE False:会话cookie可以在用户浏览器中保持有效期。True:关闭浏览器,则Cookie失效。

SESSION_COOKIE_DOMAIN 生效站点

SESSION_COOKIE_NAME cookie中保存session的名称

Session使用比较简单,在request.session是一个字典类。session是保存在数据库中的。

h1. Django中的中间件

在有些场合,需要对Django处理的每个request都执行某段代码。这类代码可能是在view处理之前修改传入的request,或者记录日志信息以便于调试,等等。这些可以利用中间件来实现。

中间件可以理解为拦截器。

中间件的引用:

 Python |  复制 |? 
1
MIDDLEWARE_CLASSES = (
2
    'django.middleware.common.CommonMiddleware',
3
    'django.contrib.sessions.middleware.SessionMiddleware',
4
    'django.contrib.auth.middleware.AuthenticationMiddleware',
5
    'django.middleware.doc.XViewMiddleware',
6
)


这就包含了session,认证等中间件。

中间件负责拦截所有的请求,针对不同的请求作出不同的动作。

Initializer: __init_/_(self)

Request预处理函数: process_request(self, request)

View预处理函数: process_view(self, request, view, args, kwargs)

Response后处理函数: process_response(self, request, response)

Exception后处理函数: process_exception(self, request, exception)

使用过的例子:

SqlMiddleware:负责输出业务逻辑中,所有的sql信息,用于调试。

 Python |  复制 |? 
1
class SqlMiddleware(object):
2
    def process_response(self, request, response):
3
        print "response"
4
        for x in connection.queries:
5
            print x
6
        return response


SessionIntecepterMiddleware 负责拦截所有的请求,如果请求的session中不存在用户信息,则返回到登陆页面。

 Python |  复制 |? 
01
class SqlMiddleware(object):
02
    exceptList=["/","/test/"]
03
    def process_request(self, request):
04
        print "request"
05
        print request.path
06
        if request.path in self.exceptList or "media" in request.path:
07
            return None
08
        else:
09
            if request.session.__contains__("user"):
10
                user=request.session.get("user",default=None)
11
.......
12
                if len(groupList) <1 and (("/base/serverPointGroupList/" in request.path) ):
13
                    return HttpResponseRedirect("/")
14
                print "Session============: %s" % user
15
            else:
16
                print "____________没有session_______________"
17
                return HttpResponseRedirect("/")


SessionMiddleWare。因为在我们的项目中使用memcache来完成session。所以自己实现对于session的管理

 Python |  复制 |? 
01
class SessionMiddleware(object):
02
    def process_request(self, request):
03
        sessionId = request.COOKIES.get(settings.KX_SESSION_COOKIE_NAME, None)
04
        if None == sessionId:
05
            print "create session"
06
            dict ={}
07
            sessionId = SessionFactory.insertSession()
08
            request.kx_sid = sessionId
09
        else:
10
            request.kx_sid = sessionId
11
            print "sessionId=%s" % sessionId
12
        return None
13
    def process_response(self, request, response):
14
        sessionId = request.COOKIES.get(settings.KX_SESSION_COOKIE_NAME, None)
15
        newSessionId = request.kx_sid
16
        print newSessionId
17
        if None == sessionId:
18
                response.set_cookie(settings.KX_SESSION_COOKIE_NAME,
19
                        newSessionId,expires=Constants.COOKIE_EXPIRES,
20
                        domain=settings.SESSION_COOKIE_DOMAIN
21
                        )
22
        return response


h1. decorator


装饰器的使用,可以大量的减少重复工作。

以下是一个查看方法运行时间的装饰器:

 Python |  复制 |? 
01
def profiling(func):
02
    def innerFunc(args):
03
        startTime = datetime.datetime.now()
04
        try:
05
            return func(args)
06
        finally:
07
            endTime = datetime.datetime.now()
08
            delta = endTime - startTime
09
            sec = float(delta.seconds) +float(delta.microseconds)/1000000
10
            info = "%s/t%s/t%s" %(func.__name__,"usedTime",sec)
11
            print info
12
            RedisQueue.info(Constants.LIST_NAME_PROFILELOG, info)
13
    return innerFunc


在引用的时候,在需要被管理的方法前加入@profiling即可。

@profiling

def register(request):

h1. 管理界面的修改


Change list         admin/change_list.html

Add/edit form       admin/change_form.html

Delete confirmation admin/delete_confirmation.html

Object history      admin/object_history.html

在工程模板中增加了一个模板templates/admin/buss/book/change_form.html

 Python |  复制 |? 
1
{% extends "admin/change_form.html" %}
2
{% block form_top %}
3
  <p>看到了吗?我新增了一个title</p>
4
{% endblock %}


h1. 安全


h2. SQL注入

 Python |  复制 |? 
1
def user_contacts(request):
2
    user = request.GET['username']
3
    sql = "SELECT * FROM user_contacts WHERE username = %s;"
4
    cursor = connection.cursor()
5
    cursor.execute(sql, [user])


django自动对参数进行转义。防止sql注入。

h2. 跨站点脚本

对于url上传递的参数,在页面显示的时候总是用标签{{paramName/|escape}}进行转义。

…..

h1. 部署


django提供了轻量级的webserver。单线程模式。便于开发阶段的调试。

此命令只能本机访问:python manage.py runserver 8080

监听所有的网络接口,可以让其他团队人员访问:python manage.py runserver 0.0.0.0:8080



本文固定链接: http://anyoneking.com/archives/59 | 懒散狂徒的博客
标签: ,

【上一篇】
【下一篇】

django in action:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!