您的位置:首页 > 编程语言 > Go语言

django构建blog

2013-08-16 16:05 337 查看
code online https://github.com/isohybrid/mysite/tree/master/blog

Django---》“最适合开发有限期的完美web框架”

1、创建项目

[root@alibaba-taobao ~]# django-admin.py startproject mysite

[root@alibaba-taobao ~]# cd mysite && ls

__init__.py manage.py settings.py urls.py

2、运行开发服务器dev

[root@alibaba-taobao mysite]# python manage.py runserver 0.0.0.0:8080

Validating models...

0 errors found

Django version 1.3, using settings 'mysite.settings'

Development server is running at http://0.0.0.0:8080/
Quit the server with CONTROL-C.

[10/Nov/2011 02:11:59] "GET / HTTP/1.1" 200 2051

[10/Nov/2011 02:12:00] "GET / HTTP/1.1" 200 2051





2.3、创建blog项目

[root@alibaba-taobao mysite]# python manage.py startapp blog

[root@alibaba-taobao mysite]# ll blog/

total 12

-rw-r--r-- 1 root root 0 Nov 10 16:14 __init__.py

-rw-r--r-- 1 root root 57 Nov 10 16:14 models.py

-rw-r--r-- 1 root root 383 Nov 10 16:14 tests.py

-rw-r--r-- 1 root root 26 Nov 10 16:14 views.py

把blog这个app以模块的形式添加到settings.py文件的INSTALLED_APPS元组中,声明使用该app

INSTALLED_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

'mysite.blog', ##注意有个逗号

# Uncomment the next line to enable the admin:

# 'django.contrib.admin',

# Uncomment the next line to enable admin documentation:

# 'django.contrib.admindocs',

)

2.4、设计模型来定义blog数据结构(这是基于django的blog应用核心部分)

[root@alibaba-taobao blog]# vim models.py

# Create your views here.

from django.db import models

class BlogPost(models.Model):

title = models.CharField(max_length=150)

body = models.TextField()

timestamp = models.DateTimeField()

博客很简单:就标题、内容、时间三块

2.5、设置连接数据库mysql

[root@alibaba-taobao mysite]# /etc/init.d/mysqld start

Starting MySQL: [ OK ]

[root@alibaba-taobao mysite]# mysql -uroot -palibaba

mysql> create database blog;

Query OK, 1 row affected (0.00 sec)

设置settings.py连接数据库

[root@alibaba-taobao mysite]# vim settings.py

。。。

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.

'NAME': 'blog', # Or path to database file if using sqlite3.

'USER': 'root', # Not used with sqlite3.

'PASSWORD': 'alibaba', # Not used with sqlite3.

'HOST': '', # Set to empty string for localhost. Not used with sqlite3.

'PORT': '', # Set to empty string for default. Not used with sqlite3.

}

}

通过定义好的数据结构来生成表数据,

[root@alibaba-taobao mysite]# python manage.py syncdb

Creating tables ...

Creating table auth_permission

Creating table auth_group_permissions

Creating table auth_group

Creating table auth_user_user_permissions

Creating table auth_user_groups

Creating table auth_user

Creating table auth_message

Creating table django_content_type

Creating table django_session

Creating table django_site

Creating table blog_blogpost

You just installed Django's auth system, which means you don't have any superusers defined.

Would you like to create one now? (yes/no): yes

Username (Leave blank to use 'root'): root

E-mail address: zhipeng.wangzp@alibaba-inc.com

Password:

Password (again):

Superuser created successfully.

Installing custom SQL ...

Installing indexes ...

No fixtures found.

由于在INSTALLED_APPS默认开启了django.contrib.auth,所以提示创建auth系统用户,反正下面
用到,所以提前创建好用户root:alibaba

[root@alibaba-taobao mysite]# !mysql

mysql -uroot -palibaba

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 268

Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use blog;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;

+----------------------------+

| Tables_in_blog |

+----------------------------+

| auth_group |

| auth_group_permissions |

| auth_message |

| auth_permission |

| auth_user |

| auth_user_groups |

| auth_user_user_permissions |

| blog_blogpost |

| django_admin_log |

| django_content_type |

| django_session |

| django_site |

+----------------------------+

12 rows in set (0.00 sec)

mysql> desc blog_blogpost;

+-----------+--------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-----------+--------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| title | varchar(150) | NO | | NULL | |

| body | longtext | NO | | NULL | |

| timestamp | datetime | NO | | NULL | |

+-----------+--------------+------+-----+---------+----------------+

4 rows in set (0.01 sec)

可以看到通过定义的数据结构生成了数据表。这里的ID是自动生成的。

2.6、设置admin应用(用于CRUD,即便于create read update delete)
首先在settings.py的INSTALLED_APPS元组中启用'django.contrib.auth'

INSTALLED_APPS = (

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.sites',

'django.contrib.messages',

'django.contrib.staticfiles',

'mysite.blog',

'django.contrib.admin', #注意逗号

# Uncomment the next line to enable the admin:

# 'django.contrib.admin',

# Uncomment the next line to enable admin documentation:

# 'django.contrib.admindocs',

)

运行syncdb把新添加的应用生成数据表

[root@alibaba-taobao mysite]# python manage.py syncdb

Creating tables ...

Creating table django_admin_log

Installing custom SQL ...

Installing indexes ...

No fixtures found.

再次去查看tables的话可以发现多了django_admin_log这张表

到目前为止,数据表结构和admin应用的做好了,往下要设定一个URL来访问该应用

[root@alibaba-taobao mysite]# vim urls.py

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:

from django.contrib import admin

admin.autodiscover()

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)),

)

去掉蓝色部分前面的注释符号#,实现admin页面相应
访问http://192.168.199.129:8080/admin/ 测试,这里是我的主机IP




通过admin这个管理接口,还没看到blog应用,因为需要告诉django要在admin窗口显示上面
制定好的模型,这里只需要在modules.py中导入admin应用即可:

[root@alibaba-taobao blog]# pwd

/root/mysite/blog

[root@alibaba-taobao blog]# vim models.py

from django.db import models

from django.contrib import admin

class BlogPost(models.Model):

title = models.CharField(max_length=150)

body = models.TextField()

timestamp = models.DateTimeField()

admin.site.register(BlogPost)

好了,重新刷新页面即可。




点击进去,添加博客:









保存。
这里还可以对admin的视图列表改进一下,只需在models.py中添加BlogPostAdmin类:

[root@alibaba-taobao blog]# vim models.py

admin.site.register(BlogPost)

from django.db import models

from django.contrib import admin

class BlogPost(models.Model):

title = models.CharField(max_length=150)

body = models.TextField()

timestamp = models.DateTimeField()

class BlogPostAdmin(admin.ModelAdmin):

list_display = ('title','body','timestamp')

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、创建模板

[root@alibaba-taobao blog]# cat templates/archive.html

{% block content %}

{% for post in posts %}

<h1>{{ post.title}}</h1>

<p>{{ post.timestamp}}</p>

<p>{{ post.body }}</p>

{% endfor %}

通过变量标签和块标签实现blog文章一篇篇显示,没涉及到翻页!
对于archive.html的命名随意,但是对于新创建的templates目录则强制设定的,因为
django在默认情况下会在搜索模板的时候查看应用程序下的每个templates目录。

2.8.2、创建一个视图函数(应该说,这里头也就只有视图函数才见到python)
该视图函数用于从数据库读取所有blog文章,并用上面的模板显示出来

[root@alibaba-taobao blog]# vim views.py

# Create your views here.

from django.template import loader,Context

from django.http import HttpResponse

from mysite.blog.models import BlogPost

def archive(request):

posts = BlogPost.objects.all()

t = loader.get_template("archive.html")

c = Context({'posts':posts})

return HttpResponse(t.render(c))

2.8.3、创建URL

[root@alibaba-taobao mysite]# vim urls.py

from django.conf.urls.defaults import patterns, include, url

# Uncomment the next two lines to enable the admin:

from django.contrib import admin

admin.autodiscover()

from mysite.blog.views import *

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)),

url(r'^blog/$', archive),

)





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




[root@alibaba-taobao ~]# tree mysite

mysite

|-- __init__.py

|-- __init__.pyc

|-- blog

| |-- __init__.py

| |-- __init__.pyc

| |-- models.py

| |-- models.pyc

| |-- templates

| | `-- archive.html

| |-- tests.py

| |-- views.py

| `-- views.pyc

|-- manage.py

|-- settings.py

|-- settings.pyc

|-- urls.py

`-- urls.pyc

2 directories, 15 files

说明:from 《django web开发指南》一书。。。有做过一些小改动。。

毕竟书有点旧了,因为django版本问题,会出现一些小问题。。。

不停的google就可以解决问题。。。

本文出自 “twenty_four” 博客,请务必保留此出处http://twentyfour.blog.51cto.com/945260/711249
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: