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就可以解决问题。。。

本文出自 “twenty_four” 博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/711249