虽然已经接触python好几个月了,但是始终没有用python开发过什么具体的应用。编程语言这东西本来就是一个应用的工具,不经常使用,很难有深刻的认识。之前一直在网络上看到对django的各种赞誉,而且早就下载了相关资料准备学习学习,但空有一颗上进的心却一直没有下定决心着手学习。国庆几天在家待着没什么事,终于下定决心要整django了。下面将通过实际操作,介绍一下如何使用django快速搭建一个blog。
网络上的好多资料都是针对linux系统介绍django搭建的,而且django的版本也五花八门,而且搭建的方法也分为命令行搭建和IDE搭建两种。不同环境不同版本搭建django web服务的操作还是略有不同的。下面的步骤将附带介绍作者搭建过程中遇到的困难,以及最终的解决方法。现在的好多IDE,比如pycharm,功能相当强大。使用pycharm搭建django服务可以省去好多简单繁琐的操作。笔者下面的操作主要针对在win 8下使用pycharm搭建1.7版本的django服务。
创建项目
打开pycharm,选择“new project”,在出现的如下窗口中点击Django后面的箭头。在新的窗口中填写项目的名字,以及应用的名字,比如作者填写的应用名字为blog。然后点击create,创建一个 项目。
创建完成后,对应的路径下将创建许多文件,红框内的文件为后续添加,暂时不用理会
其中lsc_site文件夹(名字有工程名字相同)下的文件为项目配置相关的一些文件,blog文件夹(名字与应用名字相同)下的文件为应用相关的文件。templates文件夹存放视图的模板,manage.py为管理工程的文件,后续的使用频率相当高。
注意,如果不是使用IDE创建的django工程,路径下的应用相关的文件夹,以及templates文件夹都需要自己手动创建。
在命令行窗口执行如下命令,验证工程是否创建成功,正常情况下会输出如下的提示信息。
D:\lsc\study\python code\lsc_site>python manage.py runserver # 注意执行命令的目录
Run 'python manage.py migrate' to apply them.
October 04, 2015 - 12:10:14
Django version 1.7.10, using settings 'lsc_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
创建应用的模型
django的应用模型的作用是实现数据库与程序对象之间的交互,其本质为python中的ORM(对象关系映射)。创建应用的模型,只需要编辑blog文件夹下的“model.py”文件。在model.py文件中添加如下代码
from django.db import models
class BlogPost(models.Model): # 应用的模型类为Model的子类,对应数据库中的一张表的模型
title = models.CharField(max_length=150) # 给表添加一个标题属性,类型为char,最长长度为150字节
body = models.TextField() # 给表添加一个文本内容的属性,类型为text
timestamp = models.DateField() # 给表添加一个timestamp属性,记录贴子最后编辑的时间
为了将应用添加到服务中,需要修改setting.py中的配置,在INSTALLED_APPS的最后一行添加blog应用。
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
)
D:\lsc\study\python code\lsc_site>python manage.py syncdb
Operations to perform:
Apply all migrations: admin, contenttypes, auth, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying sessions.0001_initial... OK
很奇怪,为什么没有创建blog的数据库表呢?这个问题作者当时也非常纳闷。最后在一篇网络文章中发现,在django1.7及之后的版本中,为了将对新的应用创建数据库的表,需要执行makemigrations和migrate两步操作。其中makemigrations的作用是产生数据库更新的sql文件,migrate则是真正的将应用的表添加到数据库中。
D:\lsc\study\python code\lsc_site>python manage.py makemigrations # 这一步会在migrations文件夹中新增一个xxx_initial.py文件,用于创建数据库表
Migrations for 'blog':
0001_initial.py:
- Create model BlogPost
D:\lsc\study\python code\lsc_site>python manage.py migrate # 向数据库中添加blog这张表
Operations to perform:
Apply all migrations: admin, blog, contenttypes, auth, sessions
Running migrations:
Applying blog.0001_initial... OK
创建完blog应用的数据库表之后,只有重新 运行web服务,就可以在控制台对blog应用进行访问和操作了,具体的操作方法参考 这篇文章。
我们开发的web应用自然是面向一般的用户的,因此不可能只允许用户在控制台界面访问服务,需要一种可视化的应用服务方法。使用django自带的admin应用就能够非常方便地实现可视化界面下访问我们自定义的应用。我们只需要在model.py中进行如下两处修改即可:
<p>from django.contrib import admin # 导入admin模块</p><p>class BlogPost...</p><p>...</p><p>admin.site.register(BlogPost)</p>
runserver后,我们就可以通过ie浏览器访问我们的应用了。点进去之后,可以操作一下创建和删除帖子。
进去之后,新增两个帖子,发现帖子无法显示标题和时间戳。这是因为没有设置应用的显示方式。
在models.py文件中新建如下 的类
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'timestamp')
并且注册该类
admin.site.register(BlogPost, <span style="color:#ff0000;">BlogPostAdmin</span>)
重新启动服务后,就可以正常显示标题和时间了。
创建Bolg的公共部分
上面提到的视图是管理员界面,那么如何定义给一般用户浏览的网页呢?这涉及到3个部分------模板,视图,URL。在templates文件夹下新建一个archive.html文件,添加如下内容:
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.timestamp }}</p>
<p>{{ post.body }}</p>
{% endfor%}
在view.py中添加如下内容
from django.template import loader, Context
from django.http import HttpResponse
from blog.models import BlogPost
def archive(request):
posts = BlogPost.objects.all() # 获取所有的帖子
t = loader.get_template('archive.html') # 在模板路径下,找到 <span style="font-family: Arial, Helvetica, sans-serif;">archive.html文件作为视图模板</span>
c = Context({'posts': posts}) # 将帖子封装成一个上下文对象
return HttpResponse(t.render(c)) # 返回http响应
上面提到的模板路径是在setting文件的末尾定义的,如下所示。低版本的django中,模板路径可能有所不同,需要根据真实的路径进行填写。
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates'),
)
那么web服务是如何将url跟视图进行关联的呢?答案是在mysite文件夹下的urls.py文件中新添加一条url映射
admin.autodiscover()
urlpatterns = patterns('',
url(r'^blog/', include('blog.urls')), # 以blog开始的url,使用blog.urls文件中定义的方式关联视图
url(r'^admin/', include(admin.site.urls)),
)
blog文件夹下新建一个urls.py文件,添加如下内容
from django.conf.urls import *
from blog.views import archive
urlpatterns = patterns('',
url(r'^$', archive), # 对于所有的url,调用views.py中的archive方法返回html文件给用户
)
至此,已经可以通过url访问blog的公共页面,如下所示。注意url是 端口号之后直接跟着blog。刚开始作者在端口号和blog之间加了admin,结果一直出不来公共页面,还以为代码添加错误了。
模板的润色
上面的模板只是改了一下字体的大小,非常简单。可以通过模板的基类对html模板进行润色。具体的修改方法为,在tempaltes文件夹下创建一个base.html文件(base.html模板是从
这里copy过来的,作者对html不熟)
<html>
<style type="text/css">
body{color:#efd;background:#453;padding:0 5em;margin:0}
h1{padding:2em 1em;background:#675}
h2{color:#bf8;border-top:1px dotted #fff;margin-top:2em}
p{margin:1em 0}
</style>
<body>
<h1>XXXblog</h1>
<h3>好好学习,天天向上</h3>
{% block content %}
{% endblock %}
</body>
</html>
然后修改archive.html文件,使其继承base文件
{% extends "base.html" %}
{% block content %}
{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.timestamp | date:"1,F jS"}}</p>
<p>{{ post.body }}</p>
{% endfor %}
{% endblock %}
重新访问公共页面,可以看到显示效果有了很大提升。