问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

django前后端分离用什么web?

发布网友 发布时间:2024-09-27 02:57

我来回答

1个回答

热心网友 时间:2024-10-07 08:33

导读:很多朋友问到关于django前后端分离用什么web的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

要调试一个用java写的后端,django写的前端的web应用应该怎么调试

在以前,你选择Pythonweb架构会受制于可用的web服务器,反之亦然。如果架构和服务器可以协同工作,那你就走运了:

但你有可能面对(或者曾有过)下面的问题,当要把一个服务器和一个架构结合起来是发现他们不是被设计成协同工作的:

基本上你只能用可以一起运行的而非你想要使用的。

那么,你怎么可以不修改服务器和架构代码而确保可以在多个架构下运行web服务器呢?答案就是PythonWebServerGatewayInterface(或简称WSGI,读作“wizgy”)。

WSGI允许开发者将选择web框架和web服务器分开。现在你可以混合匹配web服务器和web框架,选择一个适合你需要的配对。比如,你可以在Gunicorn或者Nginx/uWSGI或者Waitress上运行Django,Flask,或Pyramid。真正的混合匹配,得益于WSGI同时支持服务器和架构:

WSGI是第一篇和这篇开头又重复问道问题的答案。你的web服务器必须具备WSGI接口,所有的现代PythonWeb框架都已具备WSGI接口,它让你不对代码作修改就能使服务器和特点的web框架协同工作。

现在你知道WSGI由web服务器支持,而web框架允许你选择适合自己的配对,但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。其他语言也有类似接口:java有ServletAPI,Ruby有Rack。

说这么多了,你肯定在喊,给我看代码!好吧,看看这个极简的WSGI服务器实现:

#TestedwithPython2.7.9,LinuxMacOSX

importsocket

importStringIO

importsys

classWSGIServer(object):

address_family=socket.AF_INET

socket_type=socket.SOCK_STREAM

request_queue_size=1

def__init__(self,server_address):

#Createalisteningsocket

self.listen_socket=listen_socket=socket.socket(

self.address_family,

self.socket_type

)

#Allowtoreusethesameaddress

listen_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

#Bind

listen_socket.bind(server_address)

#Activate

listen_socket.listen(self.request_queue_size)

#Getserverhostnameandport

host,port=self.listen_socket.getsockname()[:2]

self.server_name=socket.getfqdn(host)

self.server_port=port

#ReturnheaderssetbyWebframework/Webapplication

self.headers_set=[]

defset_app(self,application):

self.application=application

defserve_forever(self):

listen_socket=self.listen_socket

whileTrue:

#Newclientconnection

self.client_connection,client_address=listen_socket.accept()

#Handleonerequestandclosetheclientconnection.Then

#loopovertowaitforanotherclientconnection

self.handle_one_request()

defhandle_one_request(self):

self.request_data=request_data=self.client_connection.recv(1024)

#Printformattedrequestdataala'curl-v'

print(''.join(

'{line}\n'.format(line=line)

forlineinrequest_data.splitlines()

))

self.parse_request(request_data)

#Constructenvironmentdictionaryusingrequestdata

env=self.get_environ()

#It'stimetocallourapplicationcallableandget

#backaresultthatwillbecomeHTTPresponsebody

result=self.application(env,self.start_response)

#Constructaresponseandsenditbacktotheclient

self.finish_response(result)

defparse_request(self,text):

request_line=text.splitlines()[0]

request_line=request_line.rstrip('\r\n')

#Breakdowntherequestlineintocomponents

(self.request_method,#GET

self.path,#/hello

self.request_version#HTTP/1.1

)=request_line.split()

defget_environ(self):

env={}

#ThefollowingcodesnippetdoesnotfollowPEP8conventions

#butit'sformattedthewayitisfordemonstrationpurposes

#toemphasizetherequiredvariablesandtheirvalues

#

#RequiredWSGIvariables

env['wsgi.version']=(1,0)

env['wsgi.url_scheme']='http'

env['wsgi.input']=StringIO.StringIO(self.request_data)

env['wsgi.errors']=sys.stderr

env['wsgi.multithread']=False

env['wsgi.multiprocess']=False

env['wsgi.run_once']=False

#RequiredCGIvariables

env['REQUEST_METHOD']=self.request_method#GET

env['PATH_INFO']=self.path#/hello

env['SERVER_NAME']=self.server_name#localhost

env['SERVER_PORT']=str(self.server_port)#8888

returnenv

defstart_response(self,status,response_headers,exc_info=None):

#Addnecessaryserverheaders

server_headers=[

('Date','Tue,31Mar201512:54:48GMT'),

('Server','WSGIServer0.2'),

]

self.headers_set=[status,response_headers+server_headers]

#ToadheretoWSGIspecificationthestart_responsemustreturn

#a'write'callable.Wesimplicity'ssakewe'llignorethatdetail

#fornow.

#returnself.finish_response

deffinish_response(self,result):

try:

status,response_headers=self.headers_set

response='HTTP/1.1{status}\r\n'.format(status=status)

forheaderinresponse_headers:

response+='{0}:{1}\r\n'.format(*header)

response+='\r\n'

fordatainresult:

response+=data

#Printformattedresponsedataala'curl-v'

print(''.join(

'{line}\n'.format(line=line)

forlineinresponse.splitlines()

))

self.client_connection.sendall(response)

finally:

self.client_connection.close()

SERVER_ADDRESS=(HOST,PORT)='',8888

defmake_server(server_address,application):

server=WSGIServer(server_address)

server.set_app(application)

returnserver

if__name__=='__main__':

iflen(sys.argv)2:

sys.exit('ProvideaWSGIapplicationobjectasmole:callable')

app_path=sys.argv[1]

mole,application=app_path.split(':')

mole=__import__(mole)

application=getattr(mole,application)

httpd=make_server(SERVER_ADDRESS,application)

print('WSGIServer:ServingHTTPonport{port}...\n'.format(port=PORT))

httpd.serve_forever()

这比第一篇的代码长的多,但也足够短(只有150行)来让你理解而避免在细节里越陷越深。上面的服务器可以做更多——可以运行你钟爱web框架所写基本的web应用,Pyramid,Flask,Django,或其他PythonWSGI框架.

不相信我?你自己试试看。保存上面的代码为webserver2.py或者直接在Github下载。如果你不传入任何参数它会提醒然后推出。

$pythonwebserver2.py

ProvideaWSGIapplicationobjectasmole:callable

django+vue前后端分离项目部署

后端用的drf,使用的是uwsgi+nginx

进入服务器项目文件目录下,我的django项目放在了“/usr/myProjects/”目录下了。在manage.py同级目录下创建uwsgi.ini文件,配置如下:

测试效果命令:

如果访问:xxx.xxx.xxx.xx:8000成功,则uwsgi.ini配置成功

我的nginx.conf所在位置是“/etc/nginx/nginx.conf”

配置文件如下:

1、第一行

主要就是给nginx加权限,vue部署后使用history路由时会去掉地址后面的‘#’号,打包部署后不加权限会有bug。

2、如配置所示,有两个Server,分别部署了前端服务,和后端服务,值得注意的是两个Server用的是同一个服务器,监听的端口不同。

3、vue部署需要注意的是反向代理地址:

以及后面的端口问题

4、后端的Server需要注意location中的uwsgi_pass后面的端口号要和uwsgi.ini中配的相同,否则监听不到

5、后端跨域问题。如果遇到跨域需要自己网上找配置,我的没遇到,可能是因为我在django的settings中配置了跨域。

6、django-suit后台管理样式崩了,需要改,但是api可以正常访问,这个有空再说

7、我开始后台监听的是8008端口,vue前端监听的是80端口,这样前端显示好看。然而问题出现了,虽然后台api可以正常访问,vue的本地开发环境也能正常运行且文字、图片资源均显示正常,但是前端vue打包线上部署后,文字信息显示正常,图片信息缺失8008端口,导致显示不出来。为图方便我选择了前端监听8008端口,后端监听80,部署后显示正常。原因不太清楚///////有空再说吧。

8、不要问我为啥都前后端分离了还部署到一个服务器上?穷,而且只是测试,没必要

9、此文仅适合入门

关于django后台admin(suit)缺失的修改(参考:django中文网:)

在环境中进入项目目录,需要收集css样式,在终端输入命令:

接下来你就回发现static文件中包含了css文件,此时再打开网站,样式显示正常

uWSGI通过xxx.ini启动后会在相同目录下生成一个xxx.pid的文件,里面只有一行内容是uWSGI的主进程的进程号。

关于uwsgi,进入同届目录下

教训

获取不到环境,那就指定环境

另外:记得重启uwsgi,重启Nginx,实在不行就先把监听的端口kill掉再重启

暴力删端口:fuser-k80/tcp

netstat-aptn命令行,查看所有开启的端口号

netstat-ntlp|grep80查看具体的端口是否使用

ps-ef|grepuwsgi查看是否有uwsgi端口存在

Django是web开发框架吗?

Django是用python为开发语言的后端,web的开发框架比如像Vue,Bootstrap等

对前后端分离设计模式的理解总结(部分Django描述)

FBV:Functionbaseview基于方法的视图

CBV:Classbaseview基于类的视图

所以之后我了解到,其实是我没有了解FBV与CBV的概念。

正所谓:类就是把数据封装进对象里,并赋予对象行为的能力。

所以我们完全可以把一个需求的接口封装成为一个类:

因为继承了django的View类,所以在默认情况下,会自动根据请求类型映射该类中对应的请求方法。

但是在所有的pythonweb框架乃至一些其他语言的框架之中,对HTTP请求类型的方法映射都是由一个专门的反射函数来实现的。

所以,总结如下:

另外值得一提的是:自己那个类中的dispatch方法中如果不自己去映射而是调用父类(django的View)的dispatch方法,另外还在前后做一些附加操作,这样的功能跟“装饰器”就很相似了。

一共有10个项目,那让我们一起来慢慢学习吧!

300系列:重定向类

400系列:客户端错误

500系列:服务端错误

Python三大web框架分别是什么哪个更好

【导读】目前,Python比较火的三大web框架有Django、Flask和Tornado,要论这三个Web框架哪个更好的话,建议一点,Django帮我们事先搭建了好多,上手会快一些,学习的话可以先从Django学起,然后再学习Flask和Tornado,下面我们就来具体了解一下Python三大web框架的详情。

1、Django

Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。

2、Flask

Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2

。Flask使用BSD授权。

Flask也被称为“microframework”,因为它使用简单的核心,用extension

增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

Flask很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask框架学会以后,可以考虑学习插件的使用。例如使用WTForm+

Flask-WTForm来验证表单数据,用SQLAlchemy+Flask-SQLAlchemy来对你的数据库进行控制。

3、Tornado

Tornado是一种Web服务器软件的开源版本。Tornado和现在的主流Web服务器框架(包括大多数Python

的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,因此Tornado是实时Web服务的一个

理想框架。

关于Python三大web框架的简单介绍,就给大家分享到这里了,当然学习是永无止境的,学习一项技能更是受益终身,所以,只要肯努力学,什么时候开始都不晚,希望大家抓紧时间进行学习吧。

结语:以上就是首席CTO笔记为大家整理的关于django前后端分离用什么web的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于django前后端分离用什么web的相关内容别忘了在本站进行查找喔。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
预算2000内的手机2000元以内双核手机 我女儿被摩托车一撞伤后,骑车人逃逸了,记住车牌号报警后,找到车主... ...擦车事件.给钱私了对方写了协议书和收据.但肇事局把车拖走了... 我被摩托车撞了对方是全责,头部还缝了六针,我可以要求赔偿多少?_百度... 对方醉酒驾摩托车撞伤家人,现在想出院静养,赔偿事宜该怎么协商,应该赔 ... 摩托车追尾我家人的车,摩托车司机骨折,交警扣了我家的车 现在需要我们... outlook 资料怎么转移到其他电脑上 正规废镍回收联系方式 手机用音乐播放器那个更好? 哪种播放器音质最好 ...对方说是拉布拉多,但是毛很长,耳朵也很大,是不是拉布拉多啊!_百度知... 萨摩耶怕热怎么办 萨摩耶怕热解决办法 PS中怎样将一图片九等分 我是菜鸟 谢谢 步骤详细点 我是PS是英文... PS 去除某种 颜色 【高手请进,菜鸟勿扰】 麻烦懂狗的给我看看这个拉布拉多,是不是品种不纯正,三个多月大,身体... 整个网站,经咨询,需一台WEB服务器和一台数据服务器,这两台服务器各起... ps新建图层是黑白方块的,怎么弄成白色。本人PS菜鸟一个、、_百度... 今天买了一只拉布拉多,感觉是串串,头尖身窄,你们帮我看看是不是太瘦的... 为什么PS工具填充不了彩色,我怎么弄都是黑到白之间的颜色.我是菜鸟 请... 什么是家训家风何谓家训家风 关于PS可选颜色参数的问题,本人菜鸟,求教!感恩 我的身高~!~!啊啊‘1 身高~~~ 教师节表彰获奖感言简短 教师节获奖感言精选28句 安全员c证如何进行延期 安全员证书需要每年年审吗?过期了怎么办? 交流发电机怎么结线 14v的发电机怎么和调解器接 为什么安卓手机连接不上苹果热点? 萨摩耶夏天怕热怎么办 萨摩很怕热吗 笔记本电脑连接wifi的图标不见了,怎么办呢? 炉甘石洗剂治疗痘痘怎么样 如何在word文档中设置艺术型边框如何在word文档中设置艺术型边框... word2007如何加边框,怎样操作呢? ...的NaOH溶液.(1)需称取NaOH固体的质量为___ g.(2)在下列仪器中:_百 ... 炉甘石可以治痘痘吗 揭的组词有哪些 经血暗红有什么病因吗 太仓市公共交通卡使用范围 暑假可能要每天往返太仓上海 坐地铁公交 有没有什么比较优惠 ...佳能AE-1,或者佳能A1,佳能F1,美能达X700。或者谁卖,我们可以交流下... 求推荐胶片相机,佳能AE-1和美能达X700哪款好呢?还有更好的推荐吗?感谢... 有关AE-1 FM-2 X700 公转私要填什么支票 农行公转私该做什么科目 《民国大侦探》周泽被害 同花顺k线默认指标如何设置 同花顺k线指标设置怎么设置的 同花顺k线怎么设置样式?