Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https 协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助)
打开终端管理员,安装choco 包管理器,输入安装命令:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
验证是否按照成功:
choco --version
下载 openssl(这里下载会很慢,请耐心等待):
choco install openssl -y
若下载失败或提示下载超时可以先清理缓存:
choco cache clear --all
然后再指定最大下载时间:
choco install openssl --execution-timeout 15400 -y
验证是否按照成功:
openssl version
生成自签名证书:
openssl req -newkey rsa:2048 -nodes -keyout F:\全栈\certs\key.pem -x509 -days 365 -out F:\全栈\certs\cert.pem
如果说找不到 openssl 的可以重新下完整版 openssl,参考这篇教程:
保姆级OpenSSL下载及安装教程,OpenSSL下载及安装教程-CSDN博客
安装成功后,再次输入生成签名证书脚本
CN
。AU
,你可以直接按回车使用默认值。CN
。Beijing
。California
。Beijing
。New York
。MyCompany
。IT Department
。localhost
。example.com
。localhost
。user@example.com
。完整示例:
Country Name (2 letter code) [AU]: CN
State or Province Name (full name) [Some-State]: Beijing
Locality Name (eg, city) []: Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MyCompany
Organizational Unit Name (eg, section) []: IT Department
Common Name (e.g., server FQDN or YOUR name) []: localhost
Email Address []: user@example.com
然后就会在指定目录下创建 私钥文件 和 证书文件 ,输入以下命令可查看生成的证书内容:
openssl x509 -in F:\全栈\certs\cert.pem -text -noout
在 Django 中安装依赖项:
pip install django-extensions
pip install django-werkzeug-debugger-runserver
pip install pyOpenSSL
pip install service_identity
添加注册应用:
INSTALLED_APPS = [
......
'werkzeug_debugger_runserver',
'django_extensions',
......
]
通过指定证书启动服务:
python manage.py runsslserver --certificate F:\全栈\certs\cert.pem --key F:\全栈\certs\key.pem
控制台显示使用了自签名证书及其密钥。
发现虽然能启动 https ,但是会提示不安全。
解决方法,将自定义安全证书放入浏览器中。终端进入生成证书的目录,将 PEM 格式的证书文件 (cert.pem
) 转换为 DER 格式的证书文件 (cert.cer
)。如果命令执行成功,你会在当前目录下生成一个名为 cert.cer
的文件,命令如下:
openssl x509 -in cert.pem -out cert.cer -outform DER
确实生成了 .cer 文件:
将证书导入客户端浏览器(基于 windows):
1、双击 .cer 证书,点击安装证书
2、选择将证书存储到"本地计算机",然后点击下一步
3、选择“受信任的根证书颁发机构”作为存储位置,点击确定
4、点击完成,证书成功被导入
成功安装好证书:
虽然是能调用摄像头了,说明 https 协议确实生效了,因为 http 协议在 web 端不允许通过路由跳转调用本地摄像头,只能本地,但是 websocket 却连接不上了。
python manage.py runsslserver --certificate F:\全栈\certs\cert.pem --key F:\全栈\certs\key.pem
可能这个命令无法启动 asgi,所以我们在 daphne
中启用 HTTPS 和 WSS,但是 daphne 不支持--cert-file
和 --key-file
参数。这些参数是 runsslserver
提供的功能,而 daphne
并未内置对 SSL/TLS 的支持。
使用 Nginx 作为反向代理
下载地址:nginx: download
启动 Nginx:
定位到刚才下载的安装包的解压路径,输入:
start nginx.exe
打开http://localhost/ 的url,你会看见欢迎页面:
停止 nginx:
nginx.exe -s stop
修改完后重新加载配置:
nginx.exe -s reload
启动:
daphne -b 127.0.0.1 -p 8001 YOLO_django.asgi:application
可以看见成功进行消费者,然而,还是 连不上 websocket ,困惑一周,已放弃本思路。
目前暂时先这样,算是烂尾了,有大佬有更好的建议可以说哦,下一篇更 localhost 调用电脑摄像头,虽然本篇烂尾了,但也学到很多东西,比如 nginx 反向代理、生成自签名证书并安装等等,相信对你也有所帮助。