前言
【瑪卡巴卡】需要搭建一個用於響應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服務問題。此處使用 uwsgi
和 supervisord
這兩個來部署,下面詳細介紹下。
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 指定了虛擬環境
一般情況就能正常啟動了,如果報錯,根據報錯信息進行修改,再附上一些有價值的參考鏈接:
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
最后啟動:
supervisorctl -c /etc/supervisord.conf
大功告成
附上一些報錯問題:
Supervisorctl error: unix:///var/run/supervisord.sock refused connection? [closed]