您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Django 14天从小白到进阶- Day1 Django 初识

5b51 2022/1/14 8:24:07 python 字数 21993 阅读 612 来源 www.jb51.cc/python

本节内容 Http原理介绍 自行开发一个Web框架 WSGI介绍 Django介绍 MVC/MTV Django安装 创建项目与APP 开发第一个页面 为什么学Django? Good questio

概述

本节内容

<p class="li1"><span class="s1"><span class="s2">Http原理介绍

Good question,知Python者必知Django,因为这可是Python语言里最流行&强大的Web框架,同时亦是全球第5大WEB框架,可快速构建稳定强大的WEB项目,大大提高开发效率,很多知名项目都是基于Django开发,如Disqus、Pinterest、Instagram、Bitbucket等, Django官方Slogan是The framework for perfectionist with deadline! 一个为完美主义者且又开发工期很紧的人设计的框架,事实确实如此,Django自身集成了丰富的WEB开发通用组件,如用户认证、分页、中间件、缓存、session等,可以避免浪费大量时间重复造轮子。

快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

jibG9jayUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnRleHQlMjIlMkMlMjJyYW5nZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIycmFuZ2UlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIySFRUUCVFNSU4RCU4RiVFOCVBRSVBRSVFNiVCMCVCOCVFOCVCRiU5QyVFOSU4MyVCRCVFNiU5OCVBRiVFNSVBRSVBMiVFNiU4OCVCNyVFNyVBQiVBRiVFNSU4RiU5MSVFOCVCNSVCNyVFOCVBRiVCNyVFNiVCMSU4MiVFRiVCQyU4QyVFNiU5QyU4RCVFNSU4QSVBMSVFNSU5OSVBOCVFNSU5QiU5RSVFOSU4MCU4MSVFNSU5MyU4RCVFNSVCQSU5NCVFMyU4MCU4MiVFOCVBNyU4MSVFNCVCOCU4QiVFNSU5QiVCRSVFRiVCQyU5QSUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTdEJTVEJTdEJTVEJTdEJTVEJTdE">HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:

jibG9jayUyMiUyQyUyMmlzVm9pZCUyMiUzQWZhbHNlJTJDJTIydHlwZSUyMiUzQSUyMnBhcmFncmFwaCUyMiUyQyUyMm5vZGVzJTIyJTNBJTVCJTdCJTIya2luZCUyMiUzQSUyMnRleHQlMjIlMkMlMjJyYW5nZXMlMjIlM0ElNUIlN0IlMjJraW5kJTIyJTNBJTIycmFuZ2UlMjIlMkMlMjJ0ZXh0JTIyJTNBJTIySFRUUCVFNSU4RCU4RiVFOCVBRSVBRSVFNiVCMCVCOCVFOCVCRiU5QyVFOSU4MyVCRCVFNiU5OCVBRiVFNSVBRSVBMiVFNiU4OCVCNyVFNyVBQiVBRiVFNSU4RiU5MSVFOCVCNSVCNyVFOCVBRiVCNyVFNiVCMSU4MiVFRiVCQyU4QyVFNiU5QyU4RCVFNSU4QSVBMSVFNSU5OSVBOCVFNSU5QiU5RSVFOSU4MCU4MSVFNSU5MyU4RCVFNSVCQSU5NCVFMyU4MCU4MiVFOCVBNyU4MSVFNCVCOCU4QiVFNSU5QiVCRSVFRiVCQyU5QSUyMiUyQyUyMm1hcmtzJTIyJTNBJTVCJTVEJTdEJTVEJTdEJTVEJTdEJTVEJTdE">

这个Client和Server端本质上是一个Socket客户端和服务器端,Http协议可以说是基于Socket的再上层封装。

403d9b0c7f8.png" alt="" width="624" height="168">

基于TCP/IP协议

你每次打开百度或其它网站,都需要先建立好TCP/IP会话,当然这个浏览器会帮你做了。

短连接

你打开 https://www.luffycity.com/  或其它网站, 当服务器端把这个页面内容全返回后,就把这次连接断开了,会话就结束了,你在浏览器上看到页面内容已经是下载到本地的了,所以此时如果服务器端更新了内容,你本地的页面自然是不会跟着变的。除非你再刷新一下,这样就又进行了一次会话。那为何是短连接呢?你想一想

被动响应

这个很好理解,你不请求百度百度是不会主动连接你的。

无状态

无状态是指,当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再发送请求给服务器的时候,他会响应,但是他不知道你就是刚才那个浏览器,简单地说,就是服务器不会去记得你,所以是无状态协议。

既然Http协议本质上是基于Socket做的,我们又学过Socket了,那能不能自己开发一个Web Server呢? 回答是of course. 

<div class="cnblogs_Highlighter">
<pre class="brush:python;gutter:true;"># -- coding:utf-8 --

import socket

def main():
sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
sock.setsockopt(socket.soL_SOCKET,socket.so_REUSEADDR,1)
sock.bind(('localhost',8000))
sock.listen(5)

while True:
    # 等待浏览器访问
    conn,addr = sock.accept()
    # 接收浏览器发送来的请求<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>
    data = conn.recv(1024)
    print(data)

    # 给浏览器返回<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>
    conn.send(b"HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=utf-8\r\n\r\n")
    conn.send("电脑前的你长的真好看!".encode("utf-8"))

    # <a href="https://www.jb51.cc/tag/guanbi/" target="_blank" class="keywords">关闭</a>和浏览器创建的socket连接
    conn.close()

if name == "main":
main()

  

我靠,这么简单,是的,就这么简单,但你现在只是返回了一句话,如果是要返回一个图片呢?一个文件呢?这就涉及你自己要负责实现文件的传送了,我们学socket传文件时,遇到过粘包问题,解决起来挺麻烦的,你现在要自己通过Socket把Http协议里的各种功能都实现了的话,估计孩子都长大了。与其浪费时间自己写,不如直接用先人的。

间的解耦。

代码

Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server 

from wsgiref.simple_server import make_server

def run_server(environ,start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/,立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
"""

start_response('200 OK',[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h1>我旁边的这个人长的真丑呀!!',encoding='utf-8'),]

if name == 'main':
httpd = make_server('localhost',8001,run_server)
httpd.serve_forever()

start_response('200 OK',[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h1>我旁边的这个人长的真丑呀!!',encoding='utf-8'),]

def run_server(environ,start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/,立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
"""

if name == 'main':
httpd = make_server('localhost',8001,run_server)
httpd.serve_forever()

def run_server(environ,start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/,立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
"""

start_response('200 OK',[('Content-Type','text/html;charset=utf-8')])
return [bytes('<h1>我旁边的这个人长的真丑呀!!',encoding='utf-8'),]

if name == 'main':
httpd = make_server('localhost',8001,run_server)
httpd.serve_forever()

<p class="p1"><span class="s1">你看别人的网站,可以根据URL不同看到不同的内容,比如这个:<a href="http://jandan.net/ooxx"&gt;<span class="s2">煎蛋网<span class="Apple-converted-space"> 

<p class="p1"><span class="s1">但我们刚才自己开发的网站,永远只能看到同样的内容

 
 
 
  wsgiref.simple_server  
 
       
 
       
 
 
      方法关联起来
     urlpatterns =         (         (  
      
 
      
 用户在浏览器上访问:http://127.0.0.1:8000/,立即执行该函数并将函数的返回值返回给用户浏览器
 内容,比如浏览器类型、版本、来源地址、url等
       
     start_response(,[(,     url = environ.get(     urlpatterns = 
     func = 
      item           item[0] ==             func = item[1             
               [bytes(func(),encoding=               [bytes(404 not found.,]
 
  __name__ ==      httpd = make_server(,8001     httpd.serve_forever()


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶