首页>>后端>>Python->django怎么直接运行(2023年最新分享)

django怎么直接运行(2023年最新分享)

时间:2023-12-11 本站 点击:0

导读:很多朋友问到关于django怎么直接运行的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

腾讯云python系列之部署Django流程

我的是centos系统

我们通过腾讯的控制台的登录按钮,进入到远程登录的界面,如图1为腾讯云的控制台界面。图2为登录以后的密码输入窗口

进入登录界面以后,会是图3这样子的情况,我们输入ls,会发现没有任何文件, 输入pip list 会提示没有安装pip,而输入python时,会显示默认安装了python2.7.5版本

一、首先我们要安装pip,根据自己的系统自行选择

centos类系统: sudo yum install python python-pip

ubuntu类系统:sudo apt-get install python python-pip

安装好以后pip list一下,看看都有哪些python安装包

二、安装django

我安装的Django版本为1.9.8的,根据自己的情况,更改后面的版本号

sudo pip install Django ==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.py startproject FirstProject,创建出FirstProject的项目。就会在该目录下创建出FirstProject这个项目,进入项目,运行python manage.py runserver

问题来了,我们运行以后,不要点击,这个是进不去的,我们应该通过腾讯云的公网ip来访问网站,但又有同学发现通过公网的ip也无法访问我们的网站,这是因为自己的腾讯云没有打开相应的端口,所以无法访问。开放端口在安全组这个选项,如图7

进入安全组,新建我们的开放端口,我开放的是80端口。如图8

开放端口后,我们重新python manage.py runserver 0.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-admin startproject HelloWorld 即可生成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_module

回到 setup() 中的最后一句 apps.populate(settings.INSTALLED_APPS)

开始看 apps.populate()

首先看这段

这些App最后都会封装成为AppConfig。且会装载到 self.app_configs 字典中

随后,分别调用每个appConfig的 import_models() 和 ready() 方法。

App的装载部分大体如此

为了方便debug我们改写下最后一句

res的类型是 Command django.contrib.staticfiles.management.commands.runserver.Command object at 0x00000101ED5163A0

重点是第二句,让我们跳到 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 服务器可通过两种办法和 FastCGI server 连接:

1. Unix domain socket(或 win32 的“命名管道")

2. TCP socket

通常 TCP socket 更简单,因为权限问题比较好配置。

如何启动 FactCGI 服务器:

到项目目录中,执行:

./manage.py runfcgi [options]

如果要看帮助:

./manage.py runfcgi help

在选项中,需要指定一个 socket 或 host 和 port 的组合,这样的话,当你启动 web server 时,就可以通过这些信息来连接到 FactCGI 服务器。

例子

在 TCP 端口中运行一个线程内服务器:

./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

在 Unix domain socket 上运行一个 preforked 服务器:

./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid

不作为后台进程执行(便于调试):

./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock

如何停止后台的 FastCGI 进程:

1. 如果指定了 pidfile 属性,则可以这样:

kill `cat $PIDFILE`

其中 $PIDFILE 是你指定的 pidfile 选项。

要重启 Unix 上的后台 FactCGI 进程,可执行下列 shell 脚本:

#!/bin/bash

# Replace these three settings.

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.py runfcgi socket=$SOCKET pidfile=$PIDFILE

Apache 的设定:

1. 需要安装了 mod_fastcgi

2. 编辑 httpd.conf:

(1) 用 FastCGIExternalServer 指向 FastCGI 服务器的位置

可以用 socket 也可以用主机+端口的方式指定。例子:

# Connect to FastCGI via a socket / named pipe.

FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock

# Connect to FastCGI via a TCP host/port.

FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033

不管上述那种情况,/home/user/public_html/mysite.fcgi 这个文件是不需要存在的。其作用指示作为一个 URL 指示 Web 服务器哪些请求需要被 FastCGI 来处理。

(2) 用 mod_rewrite 来分派需要处理的 URL 到 FastCGI.

例子:

VirtualHost 12.34.56.78

ServerName example.com

DocumentRoot /home/user/public_html

Alias /media /home/user/python/django/contrib/admin/media

RewriteEngine On

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 前。

为了服务 admin media, 也许你还需要 mod_alias.

在 lighttpd 的配置文件中加如下一段:

server.document-root = "/home/user/public_html"

fastcgi.server = (

"/mysite.fcgi" = (

"main" = (

# Use host / port instead of socket for TCP fastcgi

# "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. 只要为每一个应用指定一个独立的 FastCGI host.

如何在共享的 web hosting 上运行 Django / Apache:

编辑 .htaccess:

AddHandler fastcgi-script .fcgi

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]

再写一个 mysite.fcgi 的可执行的脚本:

#!/usr/bin/python

import sys, os

# Add a custom Python path.

sys.path.insert(0, "/home/user/python")

# Switch to the directory of your project. (Optional.)

# os.chdir("/home/user/myproject")

# Set the DJANGO_SETTINGS_MODULE environment variable.

os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"

from django.core.servers.fastcgi import runfastcgi

runfastcgi(method="threaded", daemonize="false")

在更新代码后,可以通过重新上传 mysite.fcgi 文件来指示 Apache 重启 Django 程序。

如果有 shell 权限,可以直接用 touch 命令改变时间戳:

结语:以上就是首席CTO笔记为大家整理的关于django怎么直接运行的相关内容解答汇总了,希望对您有所帮助!如果解决了您的问题欢迎分享给更多关注此问题的朋友喔~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/25160.html