β

django从头学起

会打坐的码农 118 阅读

我接触的第一个python webwerver框架是bottle,我以为这样就够了。后来我需要做一些复杂一点的web页面,所以我开始学习django。

django更加强大,但是也更复杂。我发现两个月前我学习的django,现在已经忘记的差不多了,得从头开始学。(这一次我得做点笔记。~_~)

../images/django-framework.png

安装

跟其它的python库一样,django安装简单快速。

创建网站

创建网站环境

django要求我们先创建一个应用,做为网站运行环境

django-admin.py startproject mysite

启动网站

python manage.py runserver 8000

最后一个参数是端口号,打开这个页面 http://127.0.0.1:8000/ ,可以看到以下的内容,说明我们的网站已经可以访问了。这是一个好的开始。

It worked!
Congratulations on your first Django-powered page.

Of course, you haven't actually done any work yet. Here's what to do next:
If you plan to use a database, edit the DATABASES setting in mysite/settings.py.
Start your first app by running python manage.py startapp [appname].
You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!

第一个例子——hello world

刚刚打开的页面提示我们可以设置自己的数据库,同时可以创建自己的应用。但是现在我们先不去管这些事情,我们先弄个简单的页面来看看。

上次有学习django的经验,我很快找到了我想要的文件urls.py:

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^mysite/', include('mysite.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)),
)

我猜测这用来设置uri以及其处理函数的地方,我知道要写一个函数输出 hello world ,但是具体怎么做我存在疑虑,于是我找到了一本书《The Django Book中文版》,很快找到了我要的。

根据书上所说的,我创建的文件views.py:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

同时修改urls.py,增加一行:

urlpatterns = patterns('',
...
                       ('^hello/$', hello),
...
)

此时我看到了正在运行的manage.py程序发现了文件修改,重新加载网站。我打开页面 http://127.0.0.1:8000/hello/ ,的确是预期的 Hello world

第二个例子——页面模版

接下来要做一个复杂一点点的页面,通过自定义页面模版实现的页面。

创建目录 mysite/mysite/templates ,在里面创建文件 current_datetime.html ,内容如下:

<html><body>It is now {{ current_date }}.</body></html>

我们在views.py里使用到这个模版:

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我们的模版放在哪个目录里面,修改 settings.py

TEMPLATE_DIRS = (
    "mysite/templates"
)

修改 urls.py ,绑定uri和处理函数。

urlpatterns = patterns('',
                       ...
                       ('^currentdatetime/$', current_datetime),
                       ...
)

完成了,打开页面 http://127.0.0.1:8000/currentdatetime/ ,能够看当前的时间。

第三个例子——数据库

接下来要实现一个有数据库的例子,为了简单起见,使用sqlite3。修改 settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'mysite/db/mysite.db',                      # Or path to database file if using sqlite3.
        'USER': '',
        'PASSWORD': '',
        'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

接下来有点小复杂,得先做一下思想准备:django数据库操作通过model实现,而且依赖于django app,也就是说必须先创建一个应用(或者叫做模块)。

manage.py startapp books

可以看到,我们的模块名称叫 books 。 修改配置 settings.py ,使网站运行的时候能够加载这个模块:

INSTALLED_APPS = (
    ...
    'books',
    ...
)

修改 books/models.py , 增加一个模型(它对应一个数据库表)。

from django.db import models

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

检查代码有没写错。

manage.py validate

看看模型对应的sql语句(在这里可以体现出来数据库依赖于模块 books

manage.py sqlall books

为所以启用的模块( settings.py 里有指明 )生成数据库/数据表 (数据库保存在 mysite/db/mysite.db 里 )

manage.py syncdb

这是django的强大之处,使用django,操作数据库变得更简单。

为了方便演示,我手工插入一些数据。先打开 django shell

manage.py shell

在shell里面插入两行数据表

>>> from books.models import Publisher
>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
...     city='Berkeley', state_province='CA', country='U.S.A.',
...     website='http://www.apress.com/')
>>> p1.save()
>>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
...      city='Cambridge', state_province='MA', country='U.S.A.',
...      website='http://www.oreilly.com/')
>>> p2.save()
>>> quit()

到目前为止,数据模型已经写好,测试数据也有了,剩下的就是views和template。

创建文件 mysite/templates/list_publisher.html ,我们的演示模版:

<html><body>
  <table border="1">
    <tr>
      <th>id</th>
      <th>name</th>
      <th>address</th>
      <th>city</th>
      <th>state_province</th>
      <th>country</th>
      <th>website</th>
    </tr>
{% for item in publishers %}
    <tr>
      <th>{{ item.id }}</th>
      <th>{{ item.name }}</th>
      <th>{{ item.address }}</th>
      <th>{{ item.city }}</th>
      <th>{{ item.state_province }}</th>
      <th>{{ item.country }}</th>
      <th>{{ item.website }}</th>
    </tr>
{% endfor %}
  </table>
</body></html>

views是这样的,通过模型Publisher从数据库里读数据,与模版合并。

from books.models import Publisher
from django.shortcuts import render_to_response

def list_publisher(request):
    l = Publisher.objects.all()
    return render_to_response('list_publisher.html', {'publishers': l})

别忘了修改 urlpatterns

urlpatterns = patterns('',
                      ...
                      ('^list_publisher/$', list_publisher),
                      ...
)

这样就完成了。

打开页面 http://127.0.0.1:8000/list\_publisher/ ,内容大概是这样的。

id    name    address city    state_province  country website
     Apress  2855 Telegraph Avenue   Berkeley        CA      U.S.A.  http://www.apress.com/
     O'Reilly        10 Fawcett St.  Cambridge       MA      U.S.A.  http://www.oreilly.com/

参考资料

转载请注明出处:http://www.wuyao721.com/django-beginning.html

作者:会打坐的码农
吴遥的博客
原文地址:django从头学起, 感谢原作者分享。