专栏首页Vamei实验室被解放的姜戈01 初试天涯

被解放的姜戈01 初试天涯

Django是Python下的一款网络服务器框架。Python下有许多款不同的框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。虽然Django之于Python,达不到Rail之于Ruby的一统江湖的地位,但Django无疑也是Python在网络应用方面的一位主将。

向昆汀的致敬,“被解放的姜戈”

Django意外的和昆汀的电影重名。这大大提高了Django的知名度。另外利用电影,宣传了这个奇怪的词的发音。

下面是姜戈的初体验。 

安装Django

启动计算机中的Python,尝试载入Django模块。如果可以成功载入,那么说明Django已经安装好:

import django
print(django.VERSION)

如果Django还没有安装,可以在命令行,尝试使用pip安装:

sudo pip install django

或者使用easy_install:

sudo easy_install django

黑夜中,姜戈和镣铐说再见。

启动

使用下面的命令创建项目:

django-admin.py startproject mysite

在当前目录下,将生成mysite文件夹。其文件树结构如下:

mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

进入mysite,启动服务器:

python manage.py runserver 8000

上面的8000为端口号。如果不说明,那么端口号默认为8000。

打开浏览器,访问http://127.0.0.1:8000,可以看到服务器已经在运行:

虽然有一个能跑的服务器,但什么内容都没有。

“赏金?猎人?” 姜戈满脸困惑。

第一个网页

在http协议中可以看到,网络服务器是“请求-回应”的工作模式。客户向URL发送请求,服务器根据请求,开动后厨,并最终为客人上菜。Django采用的MVC结构,即点单、厨房、储藏室分离。

我们需要一个指挥员,将URL对应分配给某个对象处理,这需要在mysite/mysite下的urls.py设定。Python会根据该程序,将URL请求分给某个厨师。

mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

将urls.py修改为:

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

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'mysite.views.first_page'),
)

我们添加了最后一行。它将根目录的URL分配给一个对象进行处理,这个对象是mysite.views.first_page。

用以处理HTTP请求的这一对象还不存在,我们在mysite/mysite下创建views.py,并在其中定义first_page函数:

# -*- coding: utf-8 -*-

from django.http import HttpResponse

def first_page(request):
    return HttpResponse("<p>世界好</p>")

第一行说明字符编码为utf-8,为下面使用中文做准备。first_page函数的功能,是返回http回复,即这里的<p>世界好</p>。first_page有一个参数request,该参数包含有请求的具体信息,比如请求的类型等,这里并没有用到。

页面效果如下:

姜戈接过枪,一枪射出去。“天哪!” 德国人惊呆了。

增加app

一个网站可能有多个功能。我们可以在Django下,以app为单位,模块化的管理,而不是将所有的东西都丢到一个文件夹中。在mysite下,运行manange.py,创建新的app:

$python manage.py startapp west

这个新的app叫做west,用来处理西餐。

我们的根目录下,出现了一个新的叫做west的文件夹。

mysite/
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── west
    ├── admin.py
    ├── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

我们还需要修改项目设置,说明我们要使用west。在mysite/setting.py中,在INSTALLED_APPS中,增加"west":

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'west',
)

可以看到,除了新增加的west,Django已经默认加载了一些功能性的app,比如用户验证、会话管理、显示静态文件等。我们将在以后讲解它们的用途。

姜戈看到曾经的工头们,眼中充满怒火。

增加APP页面

我们下面为APP增加首页。我们之前是在mysite/urls.py中设置的URL访问对象。依然采用类似的方式设置。

另一方面,为了去耦合,实现模块化,我们应该在west/urls.py中设置URL访问对象。具体如下:

首先,修改mysite/urls.py:

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

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^$', 'mysite.views.first_page'),
    url(r'^west/', include('west.urls')),
)

注意新增加的最后一行。这里,我们提醒指挥员,对于west/的访问,要参考west/urls.py。

随后,我们创建west/urls.py,添加内容:

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

urlpatterns = patterns('',
    url(r'^$', 'west.views.first_page'),
)

将URL对应west下,views.py中的first_page函数。

最后,在west下,修改views.py为:

# -*- coding: utf-8 -*-

from django.http import HttpResponse

def first_page(request):
    return HttpResponse("<p>西餐</p>")

访问http://127.0.0.1:8000/west,查看效果。

“你们这些混蛋,我一个都不会放过!” 姜戈大吼。

总结

可以看到,Django的创建过程非常简单。但这只是初次尝试Django。为了创建一个完整功能的网站,还需要调用Django许多其它的功能。

姜戈的解放,才刚刚开始。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux文本流

    我之前已经用文本编辑器修改过文本。现在,我们要深入理解所谓的“文本”。 文本流 在计算机中,所谓的数据就是0或1的二进制序列,但严格来说,Unix以字节(byt...

    Vamei
  • 被解放的姜戈04 各取所需

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 我们在庄园疑云中讲到了服务器上的数据。当...

    Vamei
  • 绘图: matplotlib Basemap简介

    在数据可视化过程中,我们常常需要将数据根据其采集的地理位置在地图上显示出来。比如说我们会想要在地图上画出城市,飞机的航线,乃至于军事基地等等。通常来说,一个地理...

    Vamei
  • Eclipse、NetBeans、IntelliJ

    Eclipse作为开发Java的IDE,从出现到现在已经有几年的时间了,其丰富的特性,操作容易和在提高生产力方面收到了广大开发者的青睐。当然一提到Java ID...

    阳光岛主
  • Spring分布式事务实现概览

    分布式事务,一直是实现分布式系统过程中最大的挑战。在只有单个数据源的单服务系统当中,只要这个数据源支持事务,例如大部分关系型数据库,和一些MQ服务,如activ...

    IT技术小咖
  • 为什么大部分NoSQL不提供分布式事务?

    像MongoDB, Cassandra, HBase, DynamoDB, 和 Riak这些NoSQL缺乏传统的原子事务机制,所谓原子事务机制是可以...

    物流IT圈
  • 如何实现微服务架构下的分布式事务

    事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:

    kubernetes中文社区
  • 原 for循环,while循环,break

    叶瑾
  • Visual Studio Package 插件开发之自动生成实体工具

      这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到【生成实体】心里可能会暗想,T4模板都可以做了、动软不是已经做了么、不就是...

    陈珙
  • 『MySQL』深入理解事务的来龙去脉

    距离上一篇MySQL的文章已经过去一个月了,终于有时间来写写关于MySQL的事务了。本文内容默认是针对 MySQL InnoDB 引擎。

    天澄技术杂谈

扫码关注云+社区

领取腾讯云代金券