Total Pageviews

Thursday, 11 October 2012

用 django构建一个blog

    Django---》“最适合开发有限期的完美web框架”
     
    1、创建项目 
    1. [root@alibaba-taobao ~]# django-admin.py startproject mysite  
    2. [root@alibaba-taobao ~]# cd mysite && ls  
    3. __init__.py manage.py settings.py urls.py  
    2、运行开发服务器dev
    1. [root@alibaba-taobao mysite]# python manage.py runserver 0.0.0.0:8080  
    2. Validating models...  
    3.    
    4. 0 errors found  
    5. Django version 1.3, using settings 'mysite.settings' 
    6. Development server is running at http://0.0.0.0:8080/  
    7. Quit the server with CONTROL-C.  
    8. [10/Nov/2011 02:11:59"GET / HTTP/1.1" 200 2051 
    9. [10/Nov/2011 02:12:00"GET / HTTP/1.1" 200 2051 

    2.3、创建blog项目
    1. [root@alibaba-taobao mysite]# python manage.py startapp blog  
    2. [root@alibaba-taobao mysite]# ll blog/  
    3. total 12 
    4. -rw-r--r-- 1 root root   0 Nov 10 16:14 __init__.py  
    5. -rw-r--r-- 1 root root 57 Nov 10 16:14 models.py  
    6. -rw-r--r-- 1 root root 383 Nov 10 16:14 tests.py  
    7. -rw-r--r-- 1 root root 26 Nov 10 16:14 views.py  
    把blog这个app以模块的形式添加到settings.py文件的INSTALLED_APPS元组中,声明使用该app
    1. INSTALLED_APPS = (  
    2.     'django.contrib.auth',  
    3.     'django.contrib.contenttypes',  
    4.     'django.contrib.sessions',  
    5.     'django.contrib.sites',  
    6.     'django.contrib.messages',  
    7.     'django.contrib.staticfiles',  
    8.     'mysite.blog',      ##注意有个逗号  
    9.     # Uncomment the next line to enable the admin:  
    10.     # 'django.contrib.admin',  
    11.     # Uncomment the next line to enable admin documentation:  
    12.     # 'django.contrib.admindocs',  
    13. )  
    2.4、设计模型来定义blog数据结构(这是基于django的blog应用核心部分)
    1. [root@alibaba-taobao blog]# vim models.py  
    2.    
    3. # Create your views here.  
    4. from django.db import models  
    5. class BlogPost(models.Model):  
    6.         title = models.CharField(max_length=150)  
    7.         body = models.TextField()  
    8.         timestamp = models.DateTimeField()  
    博客很简单:就标题、内容、时间三块
     
    2.5、设置连接数据库mysql
    1. [root@alibaba-taobao mysite]# /etc/init.d/mysqld start  
    2. Starting MySQL:                                            [ OK ]  
    3. [root@alibaba-taobao mysite]# mysql -uroot -palibaba  
    4. mysql> create database blog;  
    5. Query OK, 1 row affected (0.00 sec)  
    设置settings.py连接数据库
    1. [root@alibaba-taobao mysite]# vim settings.py  
    2. 。。。  
    3. DATABASES = {  
    4.     'default': {  
    5.         'ENGINE''django.db.backends.mysql'# Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.  
    6.         'NAME''blog',                      # Or path to database file if using sqlite3.  
    7.         'USER''root',                      # Not used with sqlite3.  
    8.         'PASSWORD''alibaba',                  # Not used with sqlite3.  
    9.         'HOST''',                      # Set to empty string for localhost. Not used with sqlite3.  
    10.         'PORT''',                      # Set to empty string for default. Not used with sqlite3.  
    11.     }  
    12. }  
    通过定义好的数据结构来生成表数据,
    1. [root@alibaba-taobao mysite]# python manage.py syncdb  
    2. Creating tables ...  
    3. Creating table auth_permission  
    4. Creating table auth_group_permissions  
    5. Creating table auth_group  
    6. Creating table auth_user_user_permissions  
    7. Creating table auth_user_groups  
    8. Creating table auth_user  
    9. Creating table auth_message  
    10. Creating table django_content_type  
    11. Creating table django_session  
    12. Creating table django_site  
    13. Creating table blog_blogpost  
    14.    
    15. You just installed Django's auth system, which means you don't have any superusers defined.  
    16. Would you like to create one now? (yes/no): yes  
    17. Username (Leave blank to use 'root'): root  
    18. E-mail address: zhipeng.wangzp@alibaba-inc.com  
    19. Password:  
    20. Password (again):  
    21. Superuser created successfully.  
    22. Installing custom SQL ...  
    23. Installing indexes ...  
    24. No fixtures found.  
    由于在INSTALLED_APPS默认开启了django.contrib.auth,所以提示创建auth系统用户,反正下面
    用到,所以提前创建好用户root:alibaba
    1. [root@alibaba-taobao mysite]# !mysql  
    2. mysql -uroot -palibaba  
    3. Welcome to the MySQL monitor. Commands end with ; or \g.  
    4. Your MySQL connection id is 268  
    5. Server version: 5.0.77 Source distribution  
    6.    
    7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.  
    8.    
    9. mysql> use blog;  
    10. Reading table information for completion of table and column names  
    11. You can turn off this feature to get a quicker startup with -A  
    12.    
    13. Database changed  
    14. mysql> show tables;  
    15. +----------------------------+  
    16. | Tables_in_blog             |  
    17. +----------------------------+  
    18. | auth_group                 |  
    19. | auth_group_permissions     |  
    20. | auth_message               |  
    21. | auth_permission            |  
    22. | auth_user                  |  
    23. | auth_user_groups           |  
    24. | auth_user_user_permissions |  
    25. | blog_blogpost              |  
    26. | django_admin_log           |  
    27. | django_content_type        |  
    28. | django_session             |  
    29. | django_site                |  
    30. +----------------------------+  
    31. 12 rows in set (0.00 sec)  
    32. mysql> desc blog_blogpost;  
    33. +-----------+--------------+------+-----+---------+----------------+  
    34. | Field     | Type         | Null | Key | Default | Extra          |  
    35. +-----------+--------------+------+-----+---------+----------------+  
    36. | id        | int(11)      | NO   | PRI | NULL    | auto_increment |  
    37. | title     | varchar(150) | NO   |     | NULL    |                |  
    38. | body      | longtext     | NO   |     | NULL    |                |  
    39. timestamp | datetime     | NO   |     | NULL    |                |  
    40. +-----------+--------------+------+-----+---------+----------------+  
    41. rows in set (0.01 sec)  
    可以看到通过定义的数据结构生成了数据表。这里的ID是自动生成的。
     
    2.6、设置admin应用(用于CRUD,即便于create read update delete)
    首先在settings.py的INSTALLED_APPS元组中启用'django.contrib.auth'
    1. INSTALLED_APPS = (  
    2.     'django.contrib.auth',  
    3.     'django.contrib.contenttypes',  
    4.     'django.contrib.sessions',  
    5.     'django.contrib.sites',  
    6.     'django.contrib.messages',  
    7.     'django.contrib.staticfiles',  
    8.     'mysite.blog',  
    9.     'django.contrib.admin',    #注意逗号  
    10.     # Uncomment the next line to enable the admin:  
    11.     # 'django.contrib.admin',  
    12.     # Uncomment the next line to enable admin documentation:  
    13.     # 'django.contrib.admindocs',  
    14. )  
    运行syncdb把新添加的应用生成数据表
    1. [root@alibaba-taobao mysite]# python manage.py syncdb  
    2. Creating tables ...  
    3. Creating table django_admin_log  
    4. Installing custom SQL ...  
    5. Installing indexes ...  
    6. No fixtures found.  
    再次去查看tables的话可以发现多了django_admin_log这张表
     
    到目前为止,数据表结构和admin应用的做好了,往下要设定一个URL来访问该应用
    1. [root@alibaba-taobao mysite]# vim urls.py  
    2.    
    3. from django.conf.urls.defaults import patterns, include, url  
    4.    
    5. # Uncomment the next two lines to enable the admin:  
    6. from django.contrib import admin  
    7. admin.autodiscover()  
    8.    
    9. urlpatterns = patterns('',  
    10.     # Examples:  
    11.     # url(r'^$', 'mysite.views.home', name='home'),  
    12.     # url(r'^mysite/', include('mysite.foo.urls')),  
    13.    
    14.     # Uncomment the admin/doc line below to enable admin documentation:  
    15.     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),  
    16.    
    17.     # Uncomment the next line to enable the admin:  
    18.      url(r'^admin/', include(admin.site.urls)),  
    19. )  
    去掉蓝色部分前面的注释符号#,实现admin页面相应
    访问http://192.168.199.129:8080/admin/ 测试,这里是我的主机IP

    通过admin这个管理接口,还没看到blog应用,因为需要告诉django要在admin窗口显示上面
    制定好的模型,这里只需要在modules.py中导入admin应用即可:
     
    1. [root@alibaba-taobao blog]# pwd  
    2. /root/mysite/blog  
    3. [root@alibaba-taobao blog]# vim models.py  
    4. from django.db import models  
    5. from django.contrib import admin  
    6.    
    7. class BlogPost(models.Model):  
    8.         title = models.CharField(max_length=150)  
    9.         body = models.TextField()  
    10.         timestamp = models.DateTimeField()  
    11.    
    12. admin.site.register(BlogPost)  
    好了,重新刷新页面即可。

    点击进去,添加博客:
     


     
    保存。
    这里还可以对admin的视图列表改进一下,只需在models.py中添加BlogPostAdmin类:
    1. [root@alibaba-taobao blog]# vim models.py  
    2.    
    3. admin.site.register(BlogPost)  
    4.    
    5. from django.db import models  
    6. from django.contrib import admin  
    7.    
    8. class BlogPost(models.Model):  
    9.         title = models.CharField(max_length=150)  
    10.         body = models.TextField()  
    11.         timestamp = models.DateTimeField()  
    12.    
    13. class BlogPostAdmin(admin.ModelAdmin):  
    14.         list_display = ('title','body','timestamp')  
    15.    
    16. admin.site.register(BlogPost,BlogPostAdmin)  
    刷新页面:

    顺便我们还可以修改TIME_ZONE为亚洲上海和LANGUAGE_CODE为zh_CN,到settings.py里修改即可
     

    到这里,后台管理、数据库后台都搞定了,但是对于一个博客还需要一个前台页面!
    这里不谈及前端设计,所以丑丑也罢。。但至少要有!!
     
    2.8、建立blog公共部分(即前端显示)
    对于前端页面,从django角度讲,有三个典型的组件:
    一个模板(template):负责将传进来的信息显示出来,一般是Html页面
    一个视图函数(view):负责从数据库获取要显示的信息,替代了SQL语句。其实在上面把blog数据结构生成数据库表也是django底层处理的,替代了SQL语句。即为屏蔽的数据库层面,好处是数据库迁移之类的,便捷。
    一个URL模式:定义好被访问的URL,可不是管理后台的URL哦!
    2.8.1、创建模板
    1. [root@alibaba-taobao blog]# cat templates/archive.html  
    2. {% block content %}  
    3. {% for post in posts %}  
    4. <h1>{{ post.title}}</h1>  
    5. <p>{{ post.timestamp}}</p>  
    6. <p>{{ post.body }}</p>  
    7. {% endfor %}  
    通过变量标签和块标签实现blog文章一篇篇显示,没涉及到翻页!
    对于archive.html的命名随意,但是对于新创建的templates目录则强制设定的,因为
    django在默认情况下会在搜索模板的时候查看应用程序下的每个templates目录。
     
    2.8.2、创建一个视图函数(应该说,这里头也就只有视图函数才见到python)
    该视图函数用于从数据库读取所有blog文章,并用上面的模板显示出来
    1. [root@alibaba-taobao blog]# vim views.py  
    2. # Create your views here.  
    3. from django.template import loader,Context  
    4. from django.http import HttpResponse  
    5. from mysite.blog.models import BlogPost  
    6.    
    7. def archive(request):  
    8.         posts = BlogPost.objects.all()  
    9.         t = loader.get_template("archive.html")  
    10.         c = Context({'posts':posts})  
    11.         return HttpResponse(t.render(c))  
    2.8.3、创建URL
    1. [root@alibaba-taobao mysite]# vim urls.py  
    2.    
    3. from django.conf.urls.defaults import patterns, include, url  
    4.    
    5. # Uncomment the next two lines to enable the admin:  
    6. from django.contrib import admin  
    7. admin.autodiscover()  
    8. from mysite.blog.views import *  
    9.    
    10. urlpatterns = patterns('',  
    11.     # Examples:  
    12.     # url(r'^$', 'mysite.views.home', name='home'),  
    13.     # url(r'^mysite/', include('mysite.foo.urls')),  
    14.    
    15.     # Uncomment the admin/doc line below to enable admin documentation:  
    16.     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),  
    17.    
    18.     # Uncomment the next line to enable the admin:  
    19.      url(r'^admin/', include(admin.site.urls)),  
    20.      url(r'^blog/$', archive),  
    21. )  

    这里的流程是这样的:
    访问http://192.168.199.129:8080/blog/ 被指向archive函数,该函数在mysite.blog.views
    下定义的,所以才在上面import的,通过views.py定义的内容从数据库获取内容并返回给client者。
    至于这里python和正则定义的内容不多解释了,django开发指南讲述比较清楚。
    到这里,这个blog就算是完成好了。如果说要把页面做个美化之类的,那是前端的事情咯。
    继续添加文章:

  1.   [root@alibaba-taobao ~]# tree mysite  
  2. mysite  
  3. |-- __init__.py  
  4. |-- __init__.pyc  
  5. |-- blog  
  6. |   |-- __init__.py  
  7. |   |-- __init__.pyc  
  8. |   |-- models.py  
  9. |   |-- models.pyc  
  10. |   |-- templates  
  11. |   |   `-- archive.html  
  12. |   |-- tests.py  
  13. |   |-- views.py  
  14. |   `-- views.pyc  
  15. |-- manage.py  
  16. |-- settings.py  
  17. |-- settings.pyc  
  18. |-- urls.py  
  19. `-- urls.pyc  
  20. 2 directories, 15 files  
说明:from 《django web开发指南》一书。。。有做过一些小改动。。
毕竟书有点旧了,因为django版本问题,会出现一些小问题。。。
不停的google就可以解决问题。。。