发布网友 发布时间:2024-09-30 11:50
共1个回答
热心网友 时间:2024-10-13 10:40
导读:很多朋友问到关于django怎么直接运行的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!
腾讯云python系列之部署Django流程我的是centos系统
我们通过腾讯的控制台的登录按钮,进入到远程登录的界面,如图1为腾讯云的控制台界面。图2为登录以后的密码输入窗口
进入登录界面以后,会是图3这样子的情况,我们输入ls,会发现没有任何文件,输入piplist会提示没有安装pip,而输入python时,会显示默认安装了python2.7.5版本
一、首先我们要安装pip,根据自己的系统自行选择
centos类系统:sudoyuminstallpythonpython-pip
ubuntu类系统:sudoapt-getinstallpythonpython-pip
安装好以后piplist一下,看看都有哪些python安装包
二、安装django
我安装的Django版本为1.9.8的,根据自己的情况,更改后面的版本号
sudopipinstallDjango==1.9.8
可能会出现图4这样的问题,原因是我们pip版本太低,直接按照提示升级我们的pip
更新了pip以后,安装可能会出现如图5这样的问题,我们不要在==两边加空格,因为加空格会导致不识别django的版本。
安装完以后你会发现自己找不到Django放在哪里了,其实我的django被安装在了
/usr/lib/python2.7/site-packages/
并且我们要执行创建django的命令在django的bin目录下,如图6
/usr/lib/python2.7/site-packages/django/bin
进入到该目录下,运行django-admin.pystartprojectFirstProject,创建出FirstProject的项目。就会在该目录下创建出FirstProject这个项目,进入项目,运行pythonmanage.pyrunserver
问题来了,我们运行以后,不要点击,这个是进不去的,我们应该通过腾讯云的公网ip来访问网站,但又有同学发现通过公网的ip也无法访问我们的网站,这是因为自己的腾讯云没有打开相应的端口,所以无法访问。开放端口在安全组这个选项,如图7
进入安全组,新建我们的开放端口,我开放的是80端口。如图8
开放端口后,我们重新pythonmanage.pyrunserver0.0.0.0:80,如图9
通过公网ip,就可以直接访问我们的网站了。如图10
如何把django写成service启动1、新建一个项目,每个项目目录下面会有一个manage.py文件,启用的命令中用的文件service命令。
2、执行启动服务的命令必须要到项目的根目录,在D:\django\newworldpythonmanage.pyrunserver中间直接打开django黑屏终端,选择service运行即可。
django框架怎么运行
只要你使用了django的ORM创建了model对象,如果没有在数据中创建对应的表,执行这个命令行就会在数据库中生成对应的表。
Django源码阅读(一)项目的生成与启动诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,python能有更多更丰富的成熟方案,且不再被诟病性能和可维护性。(屁话结束)
取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。
django-adminstartprojectHelloWorld即可生成django项目,命令行是exe格式的。
manage.py把参数交给命令行解析。
execute_from_command_line()通过命令行参数,创建一个管理类。然后运行他的execute()。
如果设置了reload,将会在启动前先check_errors。
check_errors()是个闭包,所以上文结尾是(django.setup)()。
直接看最后一句settings.INSTALLED_APPS。从settings中抓取app
注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于django\conf\__init__.py
这是个Settings类的懒加载封装类,直到__getattr__取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的__dict__上(下次会直接在自己身上找到,因为__getattr__优先级较低)
为了方便debug,我们直接写个run.py。不用命令行的方式。
项目下建个run.py,模拟runserver命令
debug抓一下setting_mole
回到setup()中的最后一句apps.populate(settings.INSTALLED_APPS)
开始看apps.populate()
首先看这段
这些App最后都会封装成为AppConfig。且会装载到self.app_configs字典中
随后,分别调用每个appConfig的import_models()和ready()方法。
App的装载部分大体如此
为了方便debug我们改写下最后一句
res的类型是Commanddjango.contrib.staticfiles.management.commands.runserver.Commandobjectat0x00000101ED5163A0
重点是第二句,让我们跳到run_from_argv()方法,这里对参数进行了若干处理。
用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。
这里分为两种情况,如果是reload重载时,会直接执行inner_run(),而项目启动需要先执行其他逻辑。
django项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。
第一次启动时,DJANGO_AUTORELOAD_ENV为None,无法进入启动逻辑。会进入restart_with_reloader()。
在这里会将DJANGO_AUTORELOAD_ENV置为True,随后重启。
第二次时,可以进入启动逻辑了。
这里创建了一个django主线程,将inner_run()传入。
随后本线程通过reloader.run(django_main_thread),创建一个轮询守护进程。
我们接下来看django的主线程inner_run()。
当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了
这相当于我们之前在fastapi中说到的,将fastapi的app交由asgi服务器。(asgi也是django提出来的,两者本质同源)
那么这个wsgi是从哪来的?让我们来稍微回溯下
这个settings是一个对象,在之前的操作中已经从settings.py配置文件中获得了自身的属性。所以我们只需要去settings.py配置文件中寻找。
我们来寻找这个get_wsgi_application()。
它会再次调用setup(),重要的是,返回一个WSGIHandler类的实例。
这就是wsgiapp本身。
load_middleware()为构建中间件堆栈,这也是wsgiapp获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。
如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。
app入口→中间件堆栈→路由→路由节点→endpoint
所以,wsgiapp就此构建完毕,服务器传入请求至app入口,即可经过中间件到达路由进行分发。
如何用FastCGI运行Django首先要安装flup,
这是Python处理FastCGI的库。
FactCGI采用c/s模型,独立的运行一个进程。在需要处理请求时,web服务器(apache,httpd,..)直接和FactCGI进程进行通信即可。
web服务器可通过两种办法和FastCGIserver连接:
1.Unixdomainsocket(或win32的“命名管道")
2.TCPsocket
通常TCPsocket更简单,因为权限问题比较好配置。
如何启动FactCGI服务器:
到项目目录中,执行:
./manage.pyrunfcgi[options]
如果要看帮助:
./manage.pyrunfcgihelp
在选项中,需要指定一个socket或host和port的组合,这样的话,当你启动webserver时,就可以通过这些信息来连接到FactCGI服务器。
例子
在TCP端口中运行一个线程内服务器:
./manage.pyrunfcgimethod=threadedhost=127.0.0.1port=3033
在Unixdomainsocket上运行一个preforked服务器:
./manage.pyrunfcgimethod=preforksocket=/home/user/mysite.sockpidfile=django.pid
不作为后台进程执行(便于调试):
./manage.pyrunfcgidaemonize=falsesocket=/tmp/mysite.sock
如何停止后台的FastCGI进程:
1.如果指定了pidfile属性,则可以这样:
kill`cat$PIDFILE`
其中$PIDFILE是你指定的pidfile选项。
要重启Unix上的后台FactCGI进程,可执行下列shell脚本:
#!/bin/bash
#Replacethesethreesettings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd$PROJDIR
if[-f$PIDFILE];then
kill`cat--$PIDFILE`
rm-f--$PIDFILE
fi
exec/usr/bin/env-\
PYTHONPATH="../python:.."\
./manage.pyrunfcgisocket=$SOCKETpidfile=$PIDFILE
Apache的设定:
1.需要安装了mod_fastcgi
2.编辑httpd.conf:
(1)用FastCGIExternalServer指向FastCGI服务器的位置
可以用socket也可以用主机+端口的方式指定。例子:
#ConnecttoFastCGIviaasocket/namedpipe.
FastCGIExternalServer/home/user/public_html/mysite.fcgi-socket/home/user/mysite.sock
#ConnecttoFastCGIviaaTCPhost/port.
FastCGIExternalServer/home/user/public_html/mysite.fcgi-host127.0.0.1:3033
不管上述那种情况,/home/user/public_html/mysite.fcgi这个文件是不需要存在的。其作用指示作为一个URL指示Web服务器哪些请求需要被FastCGI来处理。
(2)用mod_rewrite来分派需要处理的URL到FastCGI.
例子:
VirtualHost12.34.56.78
ServerNameexample.com
DocumentRoot/home/user/public_html
Alias/media/home/user/python/django/contrib/admin/media
RewriteEngineOn
RewriteRule^/(media.*)$/$1[QSA,L]
RewriteCond%{REQUEST_FILENAME}!-f
RewriteRule^/(.*)$/mysite.fcgi/$1[QSA,L]
/VirtualHost
这里指示的重写后的url就是上面FastCGIExternalServer中那个。
上述配置将不是/media/开头的,或者指向不存在的文件的请求,转给了FastCGI.
lighttpd配置
lighttpd天然的支持FastCGI.
首先要确认你的mod_fastcgi在模块列表中,并且在mod_rewrite和mod_access后,在mod_accesslog前。
为了服务adminmedia,也许你还需要mod_alias.
在lighttpd的配置文件中加如下一段:
server.document-root="/home/user/public_html"
fastcgi.server=(
"/mysite.fcgi"=(
"main"=(
#Usehost/portinsteadofsocketforTCPfastcgi
#"host"="127.0.0.1",
#"port"=3033,
"socket"="/home/user/mysite.sock",
"check-local"="disable",
)
),
)
alias.url=(
"/media/"="/home/user/django/contrib/admin/media/",
)
url.rewrite-once=(
"^(/media.*)$"="$1",
"^/favicon\.ico$"="/media/favicon.ico",
"^(/.*)$"="/mysite.fcgi$1",
)
还可以在一个lighttp服务器上跑多个Django.只要为每一个应用指定一个独立的FastCGIhost.
如何在共享的webhosting上运行Django/Apache:
编辑.htaccess:
AddHandlerfastcgi-script.fcgi
RewriteEngineOn
RewriteCond%{REQUEST_FILENAME}!-f
RewriteRule^(.*)$mysite.fcgi/$1[QSA,L]
再写一个mysite.fcgi的可执行的脚本:
#!/usr/bin/python
importsys,os
#AddacustomPythonpath.
sys.path.insert(0,"/home/user/python")
#Switchtothedirectoryofyourproject.(Optional.)
#os.chdir("/home/user/myproject")
#SettheDJANGO_SETTINGS_MODULEenvironmentvariable.
os.environ['DJANGO_SETTINGS_MODULE']="myproject.settings"
fromdjango.core.servers.fastcgiimportrunfastcgi
runfastcgi(method="threaded",daemonize="false")
在更新代码后,可以通过重新上传mysite.fcgi文件来指示Apache重启Django程序。
如果有shell权限,可以直接用touch命令改变时间戳:
结语:以上就是首席CTO笔记为大家整理的关于django怎么直接运行的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~