转载掘金文章详细介绍了如何搭建项目
https://juejin.cn/post/7028812676230807582
Django的TemplateView指向生成的前端dist文件即可.
1、 找到project目录的urls.py,使用通用视图创建最简单的模板控制器,访问 『/』时直接返回 index.html:
from django.conf.urls import url
from django.views.generic.base import TemplateView
from myApp import views as BookView
urlpatterns =[
path('admin/', admin.site.urls),
path('add_book/',BookView.add_book),
path('show_books/',BookView.show_books),
url(r'^$', TemplateView.as_view(template_name="index.html"), name="index"),]
2、 上一步使用了Django的模板系统,所以需要配置一下模板使Django知道从哪里找到index.html。在project目录的settings.py下:
TEMPLATES =[{'BACKEND':'django.template.backends.django.DjangoTemplates',# 'DIRS': [],'DIRS':['template/dist'],'APP_DIRS':True,'OPTIONS':{
…………………
},},]
3、 我们还需要配置一下静态文件的搜索路径。同样是project目录的settings.py下:
STATICFILES_DIRS =[
os.path.join(BASE_DIR,"template/dist/static"),]
4、 配置完成,我们在project目录下输入命令python manage.py runserver,就能够看到我们的前端页面在浏览器上展现。注意服务的端口已经是Django服务的8000而不是node服务的8080了。前端部分修改后,Django服务的8000页面不会实时更新,需要重新执行npm run build打包到dist目录下,Django的端口8000才会有变化。
vue + django 项目部署(部署前端代码 ---->>前端访问后端接口---->>到配置nginx—>>转发到uwsgi 返回数据展示)
前端vue
下载node二进制包,此包已经包含node,不需要再编译
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
解压缩
tar -zxvf node-v8.6.0-linux-x64.tar.gz
进入node文件夹
[root@web02 opt]# cd node-v8.6.0-linux-x64/[root@web02 node-v8.6.0-linux-x64]# ls
bin CHANGELOG.md etc include lib LICENSE README.md share
[root@web02 node-v8.6.0-linux-x64]# ls bin
node npm npx
[root@web02 node-v8.6.0-linux-x64]# ./bin/node -v
v8.6.0[root@web02 node-v8.6.0-linux-x64]# ./bin/npm -v
5.3.0
将node命令,添加至linux环境变量,修改/etc/profile,写入
PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin
读取文件,生效PATH
source /etc/profile
测试path
[root@web02 node-v8.6.0-linux-x64]# node -v
v8.6.0[root@web02 node-v8.6.0-linux-x64]# npm -v
5.3.0
node环境有了,安装node模块,以及打包node项目
进入vue源码目录
cd 07-luffy_project_01/
安装vue模块,默认去装package.json的模块内容,如果出现模块安装失败,手动再装
npm install
此时注意,你本地写的vue代码,接口很可能连接的服务器地址有问题,注意Axios.POST提交的地址,一定得发送给django应用(如果用了nginx,就发送给nginx的入口端口)
超哥这里为了试验方便,将vue项目和django项目放在了一台服务器,通过nginx反向代理功能(8000端口),转发vue请求给django(9000)
准备编译打包vue项目,替换配置文件所有地址,改为服务器地址
sed -i 's/127.0.0.1/192.168.119.12/g'/opt/07-luffy_project_01/src/restful/api.js
确保vue的route模式是history
路径:opt/luffy/07-luffy_project_01/src/router/index.js
exportdefaultnewRouter({
linkActiveClass:'is-active',
mode:'history',//改成history模式
此时打包vue项目,生成一个dist静态文件夹
npm run build
检查dist文件夹
[root@web0207-luffy_project_01]# ls dist/
index.html static
nginx配置,找到vue的index.html首页文件即可
server { #用户访问域名或者ip,默认是nginx的80端口
listen 80;
server_name 192.168.119.12; #url匹配 / 也就是请求地址是192.168.119.12时,进入此location,返回vue的dist下index.html路飞学城首页
location / {
root /opt/07-luffy_project_01/dist;
index index.html;
}
}
配置后端代码,解决虚拟环境,保证项目干净隔离
[root@web02 opt]# cat requirements.txtcertifi==2018.11.29
chardet==3.0.4
crypto==1.4.1
Django==2.1.4
django-redis==4.10.0
django-rest-framework==0.1.0
djangorestframework==3.9.0
idna==2.8Naked==0.1.31
pycrypto==2.6.1
pytz==2018.7PyYAML==3.13redis==3.0.1
requests==2.21.0
shellescape==3.4.1
urllib3==1.24.1
uWSGI==2.0.17.1
数据库用的是sqllite,不需要配置数据库了
购物车用都的是redis,因此要启动服务器的redis-server服务端
redis-server /etc/redis.conf
ps -ef|grep redis
redis-server *:6379
通过uwsgi启动项目
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir =/opt/luffy_boy
# Django's wsgi file
module = luffy_boy.wsgi
# the virtualenv (full path)
home =/opt/venv1
# process-related settings
# master
master =true
# maximum number of worker processes
processes =1
# the socket (use the full path to be safe
socket =0.0.0.0:9000
# clear environment on exit
vacuum =true
#后台运行uwsgi
daemonize=yes
(venv1)[root@web02 opt]# uwsgi --ini luffy_boy/uwsgi.ini
配置nginx
worker_processes 1;
events {
worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.119.12;
location /{
root /opt/07-luffy_project_01/dist;
index index.html;
#这一条参数确保vue页面刷新时候,不会出现404页面
try_files $uri $uri//index.html;}
error_page 500502503504/50x.html;
location =/50x.html {
root html;}}
server {
listen 8000;
server_name 192.168.119.12;
location /{
uwsgi_pass 0.0.0.0:9000;
include /opt/nginx/conf/uwsgi_params;}
location /static{
alias /opt/static;}}}
django+vue实现websocket即使通讯
Websocket 即时通讯
1.需求
即时通讯工具一定要保障的是即时性
基于现在的通讯协议HTTP要如何保障即时性呢?
2.短连接型
基于HTTP短连接如何保障数据的即时性
HTTP的特性就是无状态的短连接,即一次请求一次响应断开连接失忆,这样服务端就无法主动的去寻找客户端给客户端主动推送消息
1.轮询
即:客户端不断向服务器发起请求索取消息
优点:基本保障消息即时性
缺点:大量的请求导致客户端和服务端的压力倍增
2.长轮询
即:客户端向服务器发起请求,在HTTP最大超时时间内不断开请求获取消息,超时后重新发起请求
优点:基本保障消息即时性
缺点:长期占用客户端独立线程,长期占用服务端独立线程,服务器压力倍增
3.长连接型
基于socket长连接,由于长连接是双向且有状态的保持连接,所以服务端可以有效的主动的向客户端推送数据
1.socketio长连接协议
优点:消息即时,兼容性强
缺点:接入复杂度高,为保障兼容性冗余依赖过多较重
2.websocket长连接协议
优点:消息即时,轻量级,灵活适应多场景,机制更加成熟
缺点:相比socket兼容性较差
总体来说,Socketio紧紧只是为了解决通讯而存在的,而Websocket是为了解决更多更复杂的场景通讯而存在的
这里推荐Websocket的原因是因为,我们的Django框架甚至是Flask框架,都有成熟的第三方库
而且Tornado框架集成Websocket
4.Django实现Websocket
使用Django来实现Websocket服务的方法很多在这里我们推荐技术最新的Channels库来实现
4.1.安装DjangoChannels
pip3 install channels
views.py
import logging
from django.views.decorators.csrf import csrf_exempt
from spyne import Application, rpc, ServiceBase, Unicode, Iterable, String, Integer
from spyne.model.compleximport ComplexModel
from spyne.protocol.soap import Soap11
from spyne.server.django import DjangoApplication
# 日志配置
logging.basicConfig(level=logging.DEBUG, filename='my_server.log')
logging.getLogger('server').setLevel(logging.DEBUG)# 声明服务类,类的方法就是客户端访问的服务,直接访问方法名就行# Unicode:参数类型,可有有多个参数,有几个写几个# _returns:响应类型classMyServer(ServiceBase):# 返回字符类型@rpc(Unicode, Unicode,_returns=Unicode)defmake_func(self, par1, par2):print(par1)#业务逻辑放这里return"success"# 返回数组类型@rpc(Unicode, _returns=Iterable(Unicode))defjson_ret(self, params1):
ary =["test","111","ceshi","222"]return ary
# 传入字典类型的参数,此User可以只传部分参数,或者一个都不传也可以,不能传没有的key,会报错@rpc(User, _returns=Unicode)defmake_func(self, project):print(User)return"success"# 传入字典类型的参数,需要声明一个类classUser(ComplexModel):
__namespace__ ='User'
name = Unicode
phone = Unicode
address = Unicode
age = Integer
soap_app = Application([SServices],'MyServer',
in_protocol=Soap11(validator="lxml"),
out_protocol=Soap11())# DjangoApplication(django使用这个,还有其他好几几种,可以以脚本方式启动等等)# 访问,urls.py中,映射server_app就可以了
server_app = csrf_exempt(DjangoApplication(soap_app))
测试test.py
from suds.client import Client
cilent=Client('http://ip:port/urls中的路由?wsdl')# client.service.方法名 (调用格式)
ret = client.service.make_func()
还可以不使用django开发,脚本开发启动,直接运行文件即可访问
# Application is the glue between one or more service definitions, interface and protocol choices.from spyne import Application
# @rpc decorator exposes methods as remote procedure calls# and declares the data types it accepts and returnsfrom spyne import rpc
# spyne.service.ServiceBase is the base class for all service definitions.from spyne import ServiceBase
# The names of the needed types for implementing this service should be self-explanatory.from spyne import Iterable, Integer, Unicode
from spyne.protocol.soap import Soap11
# Our server is going to use HTTP as transport, It’s going to wrap the Application instance.from spyne.server.wsgi import WsgiApplication
# step1classHelloWorldService(ServiceBase):@rpc(Unicode, Integer, _returns=Iterable(Unicode))defsay_hello(self, name, times):for i inrange(times):yieldu'Hello, %s'% name
# step2
soap_app = Application([HelloWorldService],'hello',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11())# step3
wsgi_app = WsgiApplication(soap_app)if __name__ =='__main__':import logging
from wsgiref.simple_server import make_server
# configure the python logger to show debugging output
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('spyne.protocol.xml').setLevel(logging.DEBUG)
server = make_server('127.0.0.1',8005, wsgi_app)
server.serve_forever()
离线创建Vue项目
从github上下载https://github.com/vuejs-templates/webpack 解压之后放到本地用户目录下的
.vue-templates
目录下,下载之后的压缩包为
webpack-develop.zip
,我们解压之后,需要更改目录名为webpack。用户目录下的目录为
.vue-templates
,注意文件夹名称前面的点(.)。这样,我们再进行
vue init webpack vuedemo
命令的时候,需要带上参数–offline表示离线初始化.
在运行
npm run dev
版权归原作者 我就是我是好孩子啊 所有, 如有侵权,请联系我们删除。