Django在OS X下的编程实战(一)构建一个博客系统

来源:互联网 发布:sql server怎么使用 编辑:程序博客网 时间:2024/06/07 23:11

废话少说,直奔主题,你要做事之前需要有一台电脑,最好是Linux或者OS X,因为我在Macbook pro下工作,所以至少这里的命令都在OS X下运行通过的。所有代码都是单独一行方便你拷贝。Python代码会有>>>的提示,除此之前,没有特别提示都是在命令行窗口进行,这里也不去关心你的系统权限问题,su或者sudo的事情,请自行搞定。


安装Django,这里是实战,不会解释太多架构和理论,边做边体会。

pip install Django==1.8.6

或者你和我一样,用的Anaconda,那么用下面的命令安装

conda install Django


(可选操作)如果你是处女座,那么希望在一个很干净的python环境下工作,那么创建虚拟环境,这一部分不是Django的内容,代码放在这里。

conda create --name myenv python=3

你会看到类似下面的屏幕输出

Using Anaconda Cloud api site https://api.anaconda.orgFetching package metadata .........Solving package specifications: ..........Package plan for installation in environment /Users/Winnerineast/anaconda/envs/myenv:The following packages will be downloaded:    package                    |            build    ---------------------------|-----------------    xz-5.2.2                   |                0         288 KB  conda-forge    python-3.5.2               |                2        24.7 MB  conda-forge    certifi-2016.8.2           |           py35_0         221 KB  conda-forge    setuptools-25.1.6          |           py35_0         320 KB  conda-forge    pip-8.1.2                  |           py35_0         1.6 MB  conda-forge    ------------------------------------------------------------                                           Total:        27.1 MBThe following NEW packages will be INSTALLED:    ca-certificates: 2016.8.2-3      conda-forge    certifi:         2016.8.2-py35_0 conda-forge    ncurses:         5.9-8           conda-forge    openssl:         1.0.2h-2        conda-forge    pip:             8.1.2-py35_0    conda-forge    python:          3.5.2-2         conda-forge    readline:        6.2-0           conda-forge    setuptools:      25.1.6-py35_0   conda-forge    sqlite:          3.13.0-1        conda-forge    tk:              8.5.19-0        conda-forge    wheel:           0.29.0-py35_0   conda-forge    xz:              5.2.2-0         conda-forge    zlib:            1.2.8-3         conda-forgeProceed ([y]/n)? yPruning fetched packages from the cache ...Fetching packages ...xz-5.2.2-0.tar 100% |##############################################################################################################################| Time: 0:00:02 104.66 kB/spython-3.5.2-2 100% |##############################################################################################################################| Time: 0:00:22   1.17 MB/scertifi-2016.8 100% |##############################################################################################################################| Time: 0:00:01 132.93 kB/ssetuptools-25. 100% |##############################################################################################################################| Time: 0:00:02 123.01 kB/spip-8.1.2-py35 100% |##############################################################################################################################| Time: 0:00:03 525.07 kB/sExtracting packages ...[      COMPLETE      ]|#################################################################################################################################################| 100%Linking packages ...[      COMPLETE      ]|#################################################################################################################################################| 100%## To activate this environment, use:# $ source activate myenv## To deactivate this environment, use:# $ source deactivate#

这个命令将会创建一个单独的完整python3运行环境,接下来输入以下命令,激活这个myenv虚拟环境:

source activate myenv

激活之后的样子如下,在命令行的提示符前面有一个括号,里面显示目前命令对那个python环境有效果。

(myenv) thismachine:~ home$ 

为了验证Django是否安装好,键入

python

进入python环境,然后使用以下代码确认Django的版本:

>>> import django>>> django.VERSION(1, 10, 0, 'final', 1)

创建你的第一个项目,Django提供了一些命令行工作,运行以下命令创建你的项目,注意一下,这个命令在哪个目录下运行,就会在当前目录生成项目,所以你如果需要在特定的目录创建项目,请先切换当前目录为那个目录:

django-admin startproject mysite


这个项目的目录结构如下:

mysite/

manage。py

mysite/

__init__.py

settings.py

urls.py

wsgi.py

这个项目的具体含义,我们随着编程的深入逐步展开,这里就不展开讲解了。接下来,需要初始化这个项目的数据库数据,运行以下代码:

(myenv) thismachine:~ home$ cd mysite(myenv) thismachine home$ python manage.py migrateOperations to perform:  Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations:  Rendering model states... DONE  Applying contenttypes.0001_initial... OK  Applying auth.0001_initial... OK  Applying admin.0001_initial... OK  Applying admin.0002_logentry_remove_auto_add... OK  Applying contenttypes.0002_remove_content_type_name... OK  Applying auth.0002_alter_permission_name_max_length... OK  Applying auth.0003_alter_user_email_max_length... OK  Applying auth.0004_alter_user_username_opts... OK  Applying auth.0005_alter_user_last_login_null... OK  Applying auth.0006_require_contenttypes_0002... OK  Applying auth.0007_alter_validators_add_error_messages... OK  Applying auth.0008_alter_user_username_max_length... OK  Applying sessions.0001_initial... OK

运行一个开发服务器,请使用以下代码:

(myenv) thismachine:mysite home$ python manage.py runserverPerforming system checks...System check identified no issues (0 silenced).August 25, 2016 - 07:44:57Django version 1.10, using settings 'mysite.settings'Starting development server at http://127.0.0.1:8000/Quit the server with CONTROL-C.


很容易,你可以联想到下面的一些定制命令,比如在特定IP和端口运行这个项目:

python manage.pyrun server127.0.0.1:8001 --settings=mysite.settings

接下来,需要在这个服务器上创建自己的程序,请使用以下命令:

python manage.py startapp blog

生成的代码结构如下:

blog/

__init__.py

admin.py

migrations/

__init__.py

models.py

tests.py

views.py


不解释细节,就是一套模版生成的,每个文件的价值,在接下来的定制过程中一一介绍。

万变不离其宗,所有程序的核心就是处理数据,所以我们首先需要定义和初始化数据,换句话就是模型。在Django框架里面,已经抽象了模型,参见django.db.models.Model。所以的数据模型都是从这个起始的。

让我们来看blog的模型代码吧。以下代码都是在models.py中修改和增加的,如果你习惯了用IDE,推荐你用PyCharm(具体安装和使用PyCharm的文章,我会单独写)。

from django.db import modelsfrom django.utils import timezonefrom django.contrib.auth.models import Userclass Post(models.Model):    STATUS_CHOICES = (        ('draft','Draft'),        ('published','Published'),    )    title = models.CharField(max_length=250)    slug = models.SlugField(max_length=250,                            unique_for_date='publish')    author = models.ForeignKey(User,                               related_name='blog_posts')    body = models.TextField()    publish = models.DateTimeField(default=timezone.now)    created = models.DateTimeField(auto_now_add=True)    updated = models.DateTimeField(auto_now=True)    status = models.CharField(max_length=10,                              choices=STATUS_CHOICES,                              default='draft')    class Meta:        ordering = ('-publish',)    def __str__(self):        return self.title

以上的这些数据模型定义和数据库字段定义是相仿的,只是语法不一样,具体和全部的模型定义,请参见这里点击打开链接

为了能够让Django可以按照模型定义创建数据库里面的表格,我们需要在settings.py里面增添:

INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles','blog'<span style="font-family: Arial, Helvetica, sans-serif;"></span>
]

这样,就能在数据库创建blog的相关表和字段。接下来需要命令行去扫描settings内容来创建blog。

(myenv) thismachine:mysite home$ python manage.py makemigrations blogMigrations for 'blog':  blog/migrations/0001_initial.py:    - Create model Post

这个命令在blog/migration下面生成一个针对数据库的0001_initial.py,它的内容可以通过这个看到:

(myenv) thismachine:mysite home$ python manage.py sqlmigrate blog 0001BEGIN;---- Create model Post--CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(250) NOT NULL, "slug" varchar(250) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(10) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"));CREATE INDEX "blog_post_2dbcba41" ON "blog_post" ("slug");CREATE INDEX "blog_post_4f331e2f" ON "blog_post" ("author_id");COMMIT;

执行迁移指令,创建表格:

(myenv) thismachine:mysite home$ python manage.py migrateOperations to perform:  Apply all migrations: admin, auth, blog, contenttypes, sessionsRunning migrations:  Rendering model states... DONE  Applying blog.0001_initial... OK

接下来,我们需要创建一个超级用户,然后在这个用户之下,再展开其他用户和操作:

(myenv) WMBP:mysite Winnerineast$ python manage.py createsuperuserUsername (leave blank to use 'winnerineast'): adminEmail address: admin@admin.comPassword: Password (again): Superuser created successfully.

这个时候,再运行这个站点,当你打开http://localhost:8000/admin的时候,需要输入用户名和密码。进去之后就是标准的用户管理界面,按照惯例博客的方法,在图形界面下管理博客用户。目前,只看得到Group和Users,我们现在把blog模型加进来,这就需要在admin.py里面注册:

from django.contrib import adminfrom .models import Post# Register your models here.admin.site.register(Post)
奇妙的是,不需要重启服务器,直接保存admin.py,刷新浏览器,在管理界面就出现了Blog。这样,你可以直接在管理界面直接增加博客的帖子。你看到了admin.py就是控制管理界面的设置,如果要定制帖子创建选项,那么改这个文件吧,以下是我们定制化的代码:

from django.contrib import adminfrom .models import Postclass PostAdmin(admin.ModelAdmin):    list_display = ('title','slug','author','publish',                    'status')    list_filter = ('status','created','publish','author')    search_fields = ('title','body')    prepopulated_fields = {'slug': ('title',)}    raw_id_fields = ('author',)    date_hierarchy = 'publish'    ordering = ['status','publish']admin.site.register(Post,PostAdmin)

如此往复,改一点代码,刷新一下浏览器,多试试就都明白了。架构了数据模型,接下来就是用API对于数据进行操作,下面通过python命令行界面打开一个对站点数据进行操作的接口。

(myenv) thismachine:mysite home$ python manage.py shellPython 3.5.2 | packaged by conda-forge | (default, Jul 26 2016, 01:37:38) [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwinType "help", "copyright", "credits" or "license" for more information.(InteractiveConsole)>>> from django.contrib.auth.models import User>>> from blog.models import Post>>> user = User.objects.get(username='admin')>>> Post.objects.create(title='One more post',... slug='one-more-post',... body='Post today',... author=user)<Post: One more post>
Post.save()

更多操作可以参见Django的在线文档。


0 0
原创粉丝点击