【python】使用Django搭建web服務器並部署


前言

【瑪卡巴卡】需要搭建一個用於響應requests請求的web服務器用於掙錢,現在嘗試用Django一步一步實現,並部署。此篇文檔不涉及瀏覽器實際訪問web頁面的任何東西,只是響應后台請求。

1、創建虛擬環境

如果你不在意自己的虛擬機(服務器)上只有一個django環境,請跳過這一步。

sudo apt install python3-venv #安裝venv

mkdir django_server #新建一個目錄

cd django_server #進入新建的目錄

python3 -m venv venv #創建新的虛擬環境,在名為venv的目錄

大致內容如下:

xx@xx:~/xxx/django_server/venv$ ls -l
total 20
drwxrwxr-x 3 xx xx 4096 Nov 25 14:50 bin
drwxrwxr-x 2 xx xx 4096 Nov 25 14:48 include
drwxrwxr-x 3 xx xx 4096 Nov 25 14:48 lib
lrwxrwxrwx 1 xx xx     3 Nov 25 14:48 lib64 -> lib
-rw-rw-r-- 1 xx xx 69 Nov 25 14:48 pyvenv.cfg
drwxrwxr-x 3 xx xx 4096 Nov 25 14:48 share
xx@xx:~/xxx/django_server/venv$

source venv/bin/activate #開始使用此虛擬環境,通過運行activate腳本來激活

deactivate #停用虛擬環境,返回正常shell

原創鏈接:https://www.cnblogs.com/gaoshaonian/p/15604008.html

2、安裝django及其項目創建

(venv) xxx:~/xx/django_server$ pip3 install django #注意這里是安裝到虛擬環境里

python -m django --version # 查看版本

django-admin startproject djangoMailServer #創建項目

目錄結構如下:

djangoMailServer/
├── db.sqlite3
├── djangoMailServer
│   ├── asgi.py
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py  #object的設置
│   ├── urls.py  #地址
│   └── wsgi.py #部署時會用到
└── manage.py

2 directories, 11 files

python3 manage.py startapp mail # 創建應用

目錄結構如下:

mail/
├── admin.py #后台相關的設置
├── apps.py  #app相關的設置文件
├── __init__.py
├── migrations  #數據庫變更相關
│   └── __init__.py
├── models.py  #數據庫模型相關
├── tests.py  #寫測試代碼的地方
└── views.py  #業務邏輯實現的地方

1 directory, 7 files

此時基本的框架就已經搭建完成,非常簡單,接下來就要進行個性化,用於實現自己的功能

3、服務啟動測試

object增加app

打開 settings.py

# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'mail',   # 注意添加了這一行,用於obj找app資源
]

...

ALLOWED_HOSTS = ['*']  #記得修改這個選項,此處代表任何地址,默認只能本機訪問,可以根據自己的需要進行修改

定義網址

根據網址的不同,可以訪問不同的內容

打開obj中的urls.py

"""MailBaitObj URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from mailbaitapp import views

urlpatterns = [
    path('admin/', admin.site.urls), #自帶的管理頁面
    path('mail/', views.recv_mailmsg), #我自己新加的地址,即 http://xxxx:xx/mail/
                                       #views 代表views.py recv_mailmsg代表定義的函數
]

響應請求

打開views.py

from django.http import HttpResponse
 
def recv_mailmsg(request):
    return HttpResponse("hello world!")

啟動服務

python3 manage.py runserver 0.0.0.0:8000
上面的 0.0.0.0:8000 代表監聽所有ip:8000端口,訪問地址就是 http://服務器IP:8000/mail/,不加這個的話,只能本機訪問 http://127.0.0.1:8000/mail/ ,這些其實都不太重要,后面部署的時候,會有專門的服務管理

此時訪問地址的話,已經可以看到hello world.

參考鏈接

4、實現C/S實際功能

服務端

服務端就是recv_mailmsg 這個函數了,只列出幾個關鍵參數,其他的可以根據業務來搞。

def recv_mailmsg(request):
  if request.method == 'POST': # 響應post請求
    info = request.POST.get('info') #獲取參數
    filename = request.FILES.get('files', None) #獲取文件

  JsonResponse({'msg':'hehe', ...}) #此處是響應json數據,和上面提到的HttpResponse相比,更豐富一些

客戶端

客戶端就是一個request請求

import requests

def send_mailmsg():
  info = {      #拼接json數據
      'msg':'hehe',
      ...
  }

  payload = {'info': json.dumps(info)} # !!! 注意,如果是post參數中混合了json和文件,必須把json轉成string,然后由`data=`發送,否則服務端取不到json

  f = open(filename, 'rb')

  response = requests.post(cloud_bait_url, headers = {}, timeout=30, verify=False, data = payload, files= {'files': f})

想要發送一些編碼為表單形式的數據(HTML表單),只需簡單地傳遞一個 dict 給 data 參數。你的數據字典在發出請求時會自動編碼為表單形式;想要發送的數據並非編碼為表單形式的。傳遞一個 string 而不是一個dict ,數據會被直接按照流發送出去。

requests快速上手
requests高級用法
Response 對象

TODO:總結下 headers 中的參數

5、部署

這一步還挺麻煩的,但是只需要理解一次就行

由於不涉及實際的瀏覽器訪問頁面,所以暫時不考慮http問題,只需考慮django服務問題。此處使用 uwsgisupervisord 這兩個來部署,下面詳細介紹下。

uwsgi

安裝

sudo pip install uwsgi

配置

既然我們要用uwsgi來管理django服務,那么首先創建對應的配置文件,例如我這里在要被管理的obj目錄下,創建了ini配置文件

touch djangoMailServer.ini

具體內容如下:

# the obj port
http = :8000

# virtual path
home=/home/xxx/venv

# the base directory (full path),obj根目錄
chdir           = /home/xxx/

# Django s wsgi file, 這個是創建obj時自動生成發的
module          = djangoMailServer.wsgi

# 並發處理進程數
listen = 64

# 后台運行,並輸出日志,自己定
daemonize = /home/xxx/uwsgi.log

...

# 還有一些其他的

可以參開這個博客:
uwsgi常用參數介紹

然后用uwsgi啟動django項目:

uwsgi --ini djangoMailServer.ini

當然了,可以直接通過命令行測試uwsgi能否正常啟動django服務

uwsgi --http :8000 --chdir /home/xxx/djangoMailServer/ --home=/home/xxx/venv --module djangoMailServer.wsgi

可以看到,上面 --home 指定了虛擬環境

一般情況就能正常啟動了,如果報錯,根據報錯信息進行修改,再附上一些有價值的參考鏈接:

如何用 uWSGI 托管 Django
django 部署

supervisord

安裝

pip3 install supervisor

配置

生成配置文件:

echo_supervisord_conf > /etc/supervisord.conf

創建 /etc/supervisord.d 目錄,並在配置文件supervisord.conf里加上

[include]
files = supervisord.d/*.ini

當然了,你可以直接把所有要被supervisord 管理的內容全部寫進supervisord.conf里,那樣比較亂就是了。

在supervisord.d/ 目錄下創建uwsgi配置文件:

[program:uwsgi]
directory=/home/xxx/djangoMailServer/
command=/usr/local/bin/uwsgi --ini djangoMailServer.ini
autostart=true
autorestart=true
startretries=10
redirect_stderr=true
stdout_logfile=/home/xxx/supervisord_uwsgi.log

supervisor配置文件

最后啟動:

supervisorctl -c /etc/supervisord.conf

大功告成

附上一些報錯問題:
Supervisorctl error: unix:///var/run/supervisord.sock refused connection? [closed]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM