django简单吗?,第1张

django这个模块其实简单的,难点在于,开发一个web,需要集合前端(css、HTML、JavaScript)和后端(数据库)的知识点,如果你学习Django就是所谓的全端开发了,难度是有的,那些说不难的,都是从其他地方转过来的

如果简单使用static,配置起来会比media要少一步,下面会比较一下。说到static,不能不说说Django开发环境和部署环境的区别,Django配置文件settingspy里的DEBUG变量就是主要的区别, DEBUG=True,说明是在开发环境(调试模式)下,DEBUG=False反之是在正式部署环境下使用。两者有很大的区别,比如缓存,出错信息的方式等等,还有今天说的静态文件的处理方式上。开发环境下静态文件都是通过Django自带的web服务器来处理的(这样会更方面)。如果把DEBUG设置成False,那么Django自带的web服务器自然不处理静态文件了,静态文件都交给nginx,apache来处理吧(这样会更高效)。

具体说说static在开发环境下怎么配置吧。

这次主要拿Django 14版本来做配置,这个要事先声明,因为14以后,Django的项目结构发生很大的变化,如果下面的配置做法放到Django 13上肯定不适应了,值得注意哦。staitc的配置只要在settingspy里做即可。

DEBUG=True

这个设定环境是处在开发环境下。

然后自己建立一个变量SITE_ROOT,变量不是必须的,只是为了方面重用,名字可以随意起。

import os

SITE_ROOT=ospathjoin(ospathabspath(ospathdirname(__file__)),'')

变量值项目的根目录,也就是settingspy的存放位置。

然后给静态文件变量赋值,告诉Django,静态文件在哪里

STATIC_ROOT = ospathjoin(SITE_ROOT,'static')

说到这里,我还是说说项目文件结构吧,这个容易蒙人,比如这次的讲的项目结构如下:

myproject

----myproject

--------__init__py

--------settingspy

--------urlspy

--------wsgipy

----blog

--------__init__py

--------modelspy

--------viewspy

--------testpy

----static

--------css

------------stylecss

--------js

------------jqueryjs

--------images

------------mejpg

----media

--------upload

注意项目的结构,你会发现SITE_ROOT就是

myproject

----myproject

的路径。

STATIC_ROOT就是

myproject

----media

的路径。

好,接着配置说

STATIC_URL = '/static/'

给静态文件url一个后缀,在templates里用到的。

最后关键的部分是STATICFILES_DIRS以下配置

STATICFILES_DIRS = (

("css", ospathjoin(STATIC_ROOT,'css')),

("js", ospathjoin(STATIC_ROOT,'js')),

("images", ospathjoin(STATIC_ROOT,'images')),

)

简要说一下,static文件夹在项目里,有css js images 三个文件夹(看项目结构),他们的路径分别是:

ospathjoin(STATIC_ROOT,'css'),ospathjoin(STATIC_ROOT,'js'),ospathjoin(STATIC_ROOT,'images');

我们分别给他们起三个别名css,js,images(你可以随意给,不过为了易记,我们原名称指定别名了)

到这里staitc算是配置完成了,并不需要再urlspy里配置相关的东西,Django就会自动找到对的路径解析静态文件了,也是在配置上static比media少了一步。

配置好了,在templates 就能正常使用静态文件了。怎么用?拿一个templates讲解吧。

<!DOCTYPE html>

<html lang="zh-CN">

<head>

<meta charset=utf-8>

<title>staitc例子</title>

<link rel="stylesheet" type="text/css" href="{{STATIC_URL}}css/stylecss" media="screen" />

<script type="text/javascript" src="{{STATIC_URL}}js/jqueryjs"></script>

</head>

<body>

<img src="{{STATIC_URL}}images/mejpg"" alt="img">

</body>

</html>

注意{{STATIC_URL}}就是取配置文件settingspy里的STATIC_URL变量,解析出来的就是:/static/。

而{{STATIC_URL}}css/stylecss最终解析出来的就是我们想要的:/static/css/stylecss,Django会根据配置文件找到相应的文件。

快到尾声的时候,讲讲正式部署环境怎么设置吧:

DEBUG=False

首先把DEBUG设置为False,告诉Django环境是正式的非调试模式下了,然后Django就不再通过自己来处理静态页面了,最后静态文件都交给Nginx Apache来处理了。

说说Nginx怎么配置,才能正确解析静态文件吧,在一个server里添加一个location静态文件处理

location /static/ {

root /home/www-data/twogoo/myproject/;

}

这个也有一个容易犯错的地方,就是路径,有的同学常常指定这样的路径:/home/www-data/twogoo/myproject/staitc/;这样Nginx应该找不到静态文件的,因为Nginx会跑到/home/www-data/twogoo/myproject/staitc/staitc/路径里找,注意这点,静态文件处理上你会顺很多。

tomcat是一个web容器,java web项目相当与容器中的一个元素 ,当把java web项目部署到服务器的时候 就相当于在容器里面加入了一个元素 tomcat启动的时候 tomcat容器会获得里面元素的相关信息 比如web项目的名称

当用户请求服务器的时候 首先根据请求的一级域名找到你启动的tomcat容器,容器在分析一级域名后面的请求字符窜截取请求的项目名字 ,根据项目名字 把请求信息发给 容器里面与项目名字对应的web项目 然后web项目处理请求 处理完了 将响应信息 发给容器 容器在返回给用户

首先你请求的地址是本机的ip地址 ,这样请求能够发送到本机上 , 那么怎么给本机的tomcat 呢 这关键点就是 端口了 请求会根据本机上所有开启的程序的端口信息 给相应的程序

tomcat的默认端口是8080 所以你的请求地址需要加上:8080 当然你可以更改tomcat的端口比如80 这样你就不用去在请求地址上加:8080 因为100以内的端口 会自动匹配

这个就是一个简单的。

如果你有 webSphere 或者 weblogic 就需要复杂的配置了。不过基本都差不多。理解思想就可以了。

  为什么要使用 Apache Stratos

  

  Apache Stratos (处于孵化阶段)是一个由 Apache community 支持的开放的 PaaS 框架项目。它带来了企业级的服务质量、管理以及安全性,表现为内部私有云,外部管理云和公有云。企业组织,云基础设施供应商以及云服务提供者可以自由的修改,发布和部署 Apache Stratos,而没有任何知识产权的限制,授权费用以及服务费。

  开放的协同工作能力

  一个开放的 PaaS 服务支持异构的IaaS环境以及多平台,多语言,多框架的环境。Apache Stratos 的cartridge模型和jCloud抽象层可以使其部署在当下比较流行的IaaS环境中(如, Amazon AWS, OpenStack, vCloud ),并且开发团队可以通过对cartridge进行扩展来实现他们想要的应用服务器。

  构建你自己的 xPaaS

  Apache Stratos PaaS框架是多种PaaS服务诸如Application PaaS(aPaaS), Integration PaaS (iPaaS) 或 Data PaaS (dPaaS) 的基础。由于我们没有规定中间件环境,所以企业或组织可以将云弹性的可扩展性,资源共享,服务水平管理以及按需自助服务等功能添加到他们的aPaaS,iPaaS或dPaaS中。

概述与目的

此帖介绍了如何(利用 Ubuntu 操作系统)在阿里云上启动和部署 Django 应用程序。这两个流程的详细步骤说明如下所述:

● 使用阿里云管理控制台启动您的第一个 Linux 实例

● 在此实例上安装和部署 Django 应用程序

关于 Django

Django 是一个用 Python 语言写的开源 Web 框架,可帮助开发人员在构想形成后仅数小时内启动 Web 应用程序。它遵循模型视图模板 (MVT) 来构建应用程序,这可降低 Web 开发的复杂性,同时可让开发人员集中精力编写应用程序。它为网站地图、内容管理、用户鉴权、RSS 提要及其他任务提供开箱即用的设置。一些高流量网站使用 Django 是因为它能够快速、灵活地进行调整,从而可满足流量波动高峰期的需求。

前提条件

1 为 Python 应用程序安装 virtualenv 和 virtualenv wrapper,目的在于为 Python 项目创建独立的环境。

● 安装 pip

sudo apt-get install python-pip

● 安装 virtualenv

sudo pip install virtualenv

● 创建目录以存储您的 virtualenv

mkdir ~/virtualenvs

● 安装 virtualenwrapper

sudo pip install virtualenvwrapper

● 将 WORKON_HOME 设置为您的 virtualenv 目录

导出 WORKON_HOME=~/virtualenvs

● 将 WORKON_HOME 设置为您的 virtualenv 目录

导出 WORKON_HOME=~/virtualenvs

● 将 virtualenvwrappersh 添加到 bashrc

将此行添加到 ~/bashrc 的末尾,以便加载 virtualenvwrapper 命令。/usr/local/bin/virtualenvwrappersh

退出,然后重新打开您的 shell,或者使用 bashrc or source ~/bashrc 命令重新加载 bashrc,然后一切准备就绪。

2 安装 git。

apt-get install git

3 安装 Nginx 作为 Web 服务器,这样您便可在其之后运行您的应用程序。

Sudo apt-get install nginx

启动您的第一个 Linux 实例

接下来向您介绍使用阿里云管理控制台运行 ECS 实例的相关步骤。

1 登录到您的帐户,然后导航到“产品与服务”部分下的“云服务器”。单击侧边栏菜单中的概览。这会显示运行中的实例列表。单击购买实例从任意地域购买实例,或者继续到下一步创建新实例。

2 单击侧边栏菜单中的实例。在实例列表中选择所需地域,然后单击右上方栏中的创建实例。

3 系统会将您重新定向到“产品购买”控制台,在此您需要选择偏好的资源包 - 对 ECS 实例和数据传输提供特殊定价的初级资源包或提供两种定价模式的高级购买资源包。您可以根据自身需求选择订阅(按月或按年)或者按量付费。此案例中,我们选择了“按量付费”。

4 在此窗口中,选择要在其中启动 ECS 实例的数据中心地域和可用性区域。如果选择了地域但未选择可用性区域,系统会将实例随机放在任何区域。

5 现在您需要选择自己想要创建的实例类型。根据自身需求,从“生成”选项卡中选择生成实例类型。生成类型根据配置和所用的计算能力表示不同的实例类型。

6 接下来,选择网络类型以启动您的 ECS 实例。可根据自身需求选择经典网络或专有网络。在经典网络中,阿里云以分布式方式分配 IP 地址。它适合于需要简单快速地使用 ECS 的用户。专有网络更多的是一种逻辑隔离私有网络,它支持专用连接。它适合于熟悉网络管理的用户。选择适当的网络类型后,选择网络计费类型:数据传输或固定带宽。在这两种情况下,您都需要设置网络带宽峰值(最大数据传输速率)。

7 现在,您需要选择操作系统。每个选项下都提供了不同操作系统版本的列表。选择 Ubuntu。

8 根据自身需要,从下拉菜单中选择系统磁盘类型。您还可以通过单击“添加磁盘”向此列表添加更多磁盘。

9 在“安全设置”部分中,您可以创建密码以提高安全性,或者在此阶段跳过此步骤并稍后从管理控制台执行此操作。

10 在“采购计划”部分中,键入您的实例名称并设置要启动的实例的数量。

11 在“概览”部分查看配置详情和总价,然后单击立即购买。

12 单击开通确认业务订单并启动实例。

13 启动实例后,您可以在控制台的实例选项卡中查看该实例。

安装和部署 Django 应用程序

您已使用阿里云管理控制台创建和启动 ECS 实例,接下来让我们了解如何安装和部署 Django 应用程序。

1 使用 ssh 命令登录到您的服务器

2 输入密码

3 通过创建一个新的 virtualenv 为部署 Django 应用程序设置环境:

mkvirtualenv DjangoApp

要退出新的 virtualenv,请使用 deactivate。

您可以使用 workon 在环境之间切换。要加载或在 virtualenv 之间切换,请使用 workon 命令:workon DjangoApp

4 在您的当前环境中安装 Django

pip install Django

5 使用 django-admin 命令创建样本项目并将目录更改为项目文件夹。

django-admin startproject todoApp

cd todoApp/

6 迁移或引导您的数据库。

python managepy migrate

7 创建超级用户以访问管理面板。

python managepy createsuperuser

8 设置用户后,通过运行由 managepy 操作的 runserver 命令测试您的应用程序

python managepy runserver 0000:8000

您将看到以下内容在端口 8000 上运行

转至 /admin,这是您的管理面板,您可在此管理应用程序。

现在使用 Nginx 将您的应用程序置于 Web 服务器之后。

9 创建数据库架构 开通 python 环境。

● 将目录更改为 Django 项目目录 

● 运行以下命令

python managepy migrate

10 收集所有静态文件(css、js 等)

● 运行以下命令以在任意特定位置收集所有静态文件

Python managepy collectstatic --noinput

● 开发人员负责将 STATIC_URL 路径设置为将收集所有静态文件的位置。

● 这些变量在项目目录内的 settingpy 中定义。

1 STATIC_URL

2 STATICFILES_DIRS

3 STATIC_ROOT

11 使用 uwsgi 服务器安装 uwsgi 库并启动服务器。

pip install uWSGI

● 创建用于部署 Django 应用程序的 ini 文件vim uwsgiini

● 将其保存到应用程序目录上的 uwsgiini。如需进一步了解如何编写 ini 文件,请参阅Python/WSGI 应用程序快速入门。运行此命令以启动您的应用程序。

uwsgi uwsgiini (您的 ini 文件)

12 更改 nginx 配置文件以用于应用程序。

server   {       listen 80 default_server;         listen [::]:80 default_server ipv6only=on;         server_name localhost;  location /static/   {         include uwsgi_params;         alias /root/todoApp/public/;  }  location  /    {        include uwsgi_params;        uwsgi_pass unix:/tmp/uwsgisock;     } }

13 重启 nginx,随后您的应用程序将启动并在端口 80 上的 nginx 之后运行。

结论

在本文中,我们讨论了如何在阿里云上部署 Django 应用程序。概括地说,第一步是(利用 Ubuntu 操作系统)运行 ECS 实例。然后,您可以在此实例上安装和部署 Django 应用程序。请注意前提条件,确保顺利完成部署。

许多Django应用需要执行异步任务, 以便不耽误http request的执行 我们也可以选择许多方法来完成异步任务, 使用Celery是一个比较好的选择, 因为Celery

有着大量的社区支持, 能够完美的扩展, 和Django结合的也很好 Celery不仅能在Django中使用, 还能在其他地方被大量的使用 因此一旦学会使用Celery, 我

们可以很方便的在其他项目中使用它

1 Celery版本

本篇博文主要针对Celery 30x 早期版本的Celery可能有细微的差别

2 Celery介绍

Celery的主要用处是执行异步任务, 可以选择延期或定时执行功能 为什么需要执行异步任务呢

第一, 假设用户正发起一个request, 并等待request完成后返回 在这一request后面的view功能中, 我们可能需要执行一段花费很长时间的程序任务, 这一时间

可能远远大于用户能忍受的范围 当这一任务并不需要立刻执行时, 我们便可以使用Celery在后台执行, 而不影响用户浏览网页 当有任务需要访问远程服务器完

成时, 我们往往都无法确定需要花费的时间

第二则是定期执行某些任务 比如每小时需要检查一下天气预报, 然后将数据储存到数据库中 我们可以编写这一任务, 然后让Celery每小时执行一次 这样我们

的web应用便能获取最新的天气预报信息

我们这里所讲的任务task, 就是一个Python功能(function) 定期执行一个任务可以被认为是延时执行该功能 我们可以使用Celery延迟5分钟调用function

task1, 并传入参数(1, 2, 3) 或者我们也可以每天午夜运行该function

我们偏向于将Celery放入项目中, 便于task访问统一数据库和Django设置

当task准备运行时, Celery会将其放入列队queue中 queue中储存着可以运行的task的list 我们可以使用多个queue, 但为了简单, 这里我们只使用一个

将任务task放入queue就像加入todo list一样 为了使task运行, 我们还需要在其他线程中运行的苦工worker worker实时观察着代运行的task, 并逐一运行这

些task 你可以使用多个worker, 通常他们位于不同服务器上 同样为了简单起见, 我们这只是用一个worker

我们稍后会讨论queue, worker和另外一个十分重要的进程, 接下来我们来动动手:

3 安装Celery

我们可以使用pip在vietualenv中安装:

pip install django-celery

4 Django设置

我们暂时使用django runserver来启动celery 而Celery代理人(broker), 我们使用Django database broker implementation 现在我们只需要知道Celery

需要broker, 使用django自身便可以充当broker (但在部署时, 我们最好使用更稳定和高效的broker, 例如Redis)

在settingspy中:

import djcelery

djcelerysetup_loader()

BROKER_URL = 'django://'

INSTALLED_APPS = (

'djcelery',

'kombutransportdjango',

)

第一二项是必须的, 第三项则告诉Celery使用Django项目作为broker

在INSTALLED_APPS中添加的djcelery是必须的 kombutransportdjango则是基于Django的broker

最后创建Celery所需的数据表, 如果使用South作为数据迁移工具, 则运行:

python managepy migrate

否则运行: (Django 16或Django 17都可以)

python managepy syncdb

5 创建一个task

正如前面所说的, 一个task就是一个Pyhton function 但Celery需要知道这一function是task, 因此我们可以使用celery自带的装饰器decorator: @task 在

django app目录中创建taskepy:

from celery import task

@task()

def add(x, y):

return x + y

当settingspy中的djcelerysetup_loader()运行时, Celery便会查看所有INSTALLED_APPS中app目录中的taskspy文件, 找到标记为task的function, 并

将它们注册为celery task

将function标注为task并不会妨碍他们的正常执行 你还是可以像平时那样调用它: z = add(1, 2)

6 执行task

让我们以一个简单的例子作为开始 例如我们希望在用户发出request后异步执行该task, 马上返回response, 从而不阻塞该request, 使用户有一个流畅的访问

过程 那么, 我们可以使用delay, 例如在在viewspy的一个view中:

from myapptasks import add

adddelay(2, 2)

Celery会将task加入到queue中, 并马上返回 而在一旁待命的worker看到该task后, 便会按照设定执行它, 并将他从queue中移除 而worker则会执行以下代

码:

import myapptasksadd

myapptasksadd(2, 2)

7 关于import

这里需要注意的是, 在impprt task时, 需要保持一致 因为在执行djcelerysetup_loader()时, task是以INSTALLED_APPS中的app名,

加tasksfunction_name注册的, 如果我们由于python path不同而使用不同的引用方式时(例如在taskspy中使用from myprojectmyapptasks import

add形式), Celery将无法得知这是同一task, 因此可能会引起奇怪的bug

8 测试

a 启动worker

正如之前说到的, 我们需要worker来执行task 以下是在开发环境中的如何启动worker:

首先启动terminal, 如同开发django项目一样, 激活virtualenv, 切换到django项目目录 然后启动django自带web服务器: python managepy runserver

然后启动worker:

python managepy celery worker --loglevel=info

此时, worker将会在该terminal中运行, 并显示输出结果

b 启动task

打开新的terminal, 激活virtualenv, 并切换到django项目目录:

$ python managepy shell

>>> from myapptasks import add

>>> adddelay(2, 2)

此时, 你可以在worker窗口中看到worker执行该task:

[2014-10-07 08:47:08,076: INFO/MainProcess] Got task from broker: myapptasksadd[e080e047-b2a2-43a7-af74-d7d9d98b02fc]

[2014-10-07 08:47:08,299: INFO/MainProcess] Task myapptasksadd[e080e047-b2a2-43a7-af74-d7d9d98b02fc] succeeded in 0183349132538s: 4

9 另一个例子

下面我们来看一个更为真实的例子, 在viewspy和taskspy中:

# viewspy

from myapptasks import do_something_with_form_data

def view(request):

form = SomeForm(requestPOST)

if formis_valid():

data = formcleaned_data

# Schedule a task to process the data later

do_something_with_form_datadelay(data)

return render_to_response()

# taskspy

@task

def do_something_with_form_data(data):

call_slow_web_service(data['user'], data['text'], )

10 调试

由于Celery的运行需要启动多个部件, 我们可能会漏掉一两个 所以我们建议:

使用最简单的设置

使用python debug和logging功能显示当前的进程

11 Eager模式

如果在settingspy设置:

CELERY_ALWAYS_EAGER = True

那么Celery便以eager模式运行, 则task便不需要加delay运行:

# 若启用eager模式, 则以下两行代码相同

adddelay(2, 2)

add(2, 2)

12 查看queue

因为我们使用了django作为broker, queue储存在django的数据库中 这就意味着我们可以通过django admin查看该queue:

# adminpy

from djangocontrib import admin

from kombutransportdjango import models as kombu_models

adminsiteregister(kombu_modelsMessage)

13 检查结果

每次运行异步task后, Celery都会返回AsyncResult对象作为结果 你可以将其保存, 然后在将来查看该task是否运行成功和返回结果:

# viewspy

result = adddelay(2, 2)

if resultready():

print "Task has run"

if resultsuccessful():

print "Result was: %s" % resultresult

else:

if isinstance(resultresult, Exception):

print "Task failed due to raising an exception"

raise resultresult

else:

print "Task failed without raising exception"

else:

print "Task has not yet run"

14 定期任务

还有一种Celery的常用模式便是执行定期任务 执行定期任务时, Celery会通过celerybeat进程来完成 Celerybeat会保持运行, 一旦到了某一定期任务需要执

行时, Celerybeat便将其加入到queue中 不像worker进程, Celerybeat只有需要一个即可

启动Celerybeat:

python managepy celery beat

使Celery运行定期任务的方式有很多种, 我们先看第一种, 将定期任务储存在django数据库中 即使是在django和celery都运行的状态, 这一方式也可以让我们

方便的修改定期任务 我们只需要设置settingspy中的一项便能开启这一方式:

# settingspy

CELERYBEAT_SCHEDULER = 'djceleryschedulersDatabaseScheduler'

根据你的说明,是因为你没有配置好centos系统的防火墙设置,导致相应的服务端口被防火墙给挡住了,所以服务器本身可以正常访问,但是外网无法访问。

直接关闭防火墙的话,会存在一定的危险,楼主可以尝试进行防火墙的设置,允许相应的程序、端口可以通过防火墙,这样会更安全些。

楼主如果对Linux系统下的防火墙如何设置不太清楚,可以百度《Linux就该这么学》,里面有相应的教程,可以参考。

其实你没有理解这样部署的优点,这样部署正如django book中所说的那样,在服务器没配置安全的情况下也不容易暴露源代码(好吧其实也没见PHP那样传统部署方法就有暴露过源代码是吧……)。

PHP上的Yii框架、ThinkPHP框架也推荐将程序文件部署在网站目录的上级目录,而只在网站目录中保留static静态文件和一个入口文件。

据我所知,python的flask、bottle、webpy等框架也是推荐如此部署的。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » django简单吗?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情