Django+Vue创建项目前后端分离
Django+Vue创建项目前后端分离
转载掘金文章详细介绍了如何搭建项目
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 opt]# cd node-v8.6.0-linux-x64/
[root node-v8.6.0-linux-x64]# ls
bin CHANGELOG.md etc include lib LICENSE README.md share
[root node-v8.6.0-linux-x64]# ls bin
node npm npx
[root node-v8.6.0-linux-x64]# ./bin/node -v
v8.6.0
[root 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 node-v8.6.0-linux-x64]# node -v
v8.6.0
[root 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
export default new Router({
linkActiveClass:'is-active',
mode: 'history',//改成history模式
此时打包vue项目,生成一个dist静态文件夹
npm run build
检查dist文件夹
[root 07-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.txt
certifi==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.8
Naked==0.1.31
pycrypto==2.6.1
pytz==2018.7
PyYAML==3.13
redis==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 500 502 503 504 /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.complex import 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:响应类型
class MyServer(ServiceBase):
# 返回字符类型
@rpc(Unicode, Unicode,_returns=Unicode)
def make_func(self, par1, par2):
print(par1)
#业务逻辑放这里
return "success"
# 返回数组类型
@rpc(Unicode, _returns=Iterable(Unicode))
def json_ret(self, params1):
ary = ["test", "111", "ceshi", "222"]
return ary
# 传入字典类型的参数,此User可以只传部分参数,或者一个都不传也可以,不能传没有的key,会报错
@rpc(User, _returns=Unicode)
def make_func(self, project):
print(User)
return "success"
# 传入字典类型的参数,需要声明一个类
class User(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 returns
from 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
# step1
class HelloWorldService(ServiceBase):
@rpc(Unicode, Integer, _returns=Iterable(Unicode))
def say_hello(self, name, times):
for i in range(times):
yield u'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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)