django之前-----web应用与框架

一web应用

web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。应用程序有两种模式C/S、B/S。

下面来看一个简单的socket服务器

# -*- coding:utf-8 -*-

import socket
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()

while 1:
    conn,client_addr=sk.accept()
    conn.recv(1024)
    conn.send(b‘hello‘)
    conn.close()
sk.close()

然后我们通过浏览器访问,浏览器出现错误信息:该网页无法正常运作

什么原因呢?我们先来看看收到请求的输出信息

data b‘GET / HTTP/1.1\r\nHost: 127.0.0.1:8800\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=IwhDDZ9RiKQUV4T5CbzGIhAcVZNxYuvAYdS7RKc0tmOmk02hHWfQ8sWnIGrN1pzC\r\n\r\n‘

这个完整的信息里面可以看到:最开始它有个http的头部信息,这个是个标准,那么我们试着去加入

改为

# -*- coding:utf-8 -*-

import socket
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()

while 1:
    conn,client_addr=sk.accept()
    conn.recv(1024)
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)  #需要一个http的头
    conn.send(b‘<h1>o98k</h1>‘) #发送的主体,也可以放入上面的那行
    conn.close()
sk.close()

现在访问正常了,也能输出我们要的信息

如果我们要根据用户输入的路径访问不同的页面呢

1 我们可以做判断,然后指向不同的函数

# -*- coding:utf-8 -*-

import socket
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()

def home(url):
    return b"this is home page"

def index(url):
    return b‘this is index home‘

while 1:
    conn,client_addr=sk.accept()
    data=conn.recv(1024)
    data_str=str(data,encoding=‘utf8‘)
    url=data_str.split(‘\r\n‘)[0].split()[1]
    print(url)
    print(‘=‘*30)
    if url==‘/index/‘:
        msg=index(url)
    elif url =="/home/":
        msg=home(url)
    else:
        msg=b"404!"
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)  #需要一个http的头
    conn.send(msg) #发送的主体,也可以放入上面的那行
    conn.close()
sk.close()

2 我们可以将这些不同的页面单独拿出来(比如文件),然后指向他们

# -*- coding:utf-8 -*-
import socket
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()

def home(url):
    with open("home.html",‘rb‘)as f:
        html_msg=f.read()
        return html_msg

def index(url):
    return b‘this is index home‘

while 1:
    conn,client_addr=sk.accept()
    data=conn.recv(1024)
    data_str=str(data,encoding=‘utf8‘)
    url=data_str.split(‘\r\n‘)[0].split()[1]
    print(url)
    print(‘=‘*120)
    if url==‘/index/‘:
        msg=index(url)
    elif url =="/home/":
        msg=home(url)
    else:
        msg=b"404!"
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)  #需要一个http的头
    conn.send(msg) #发送的主体,也可以放入上面的那行
    conn.close()
sk.close()

3 我们将他们优化一下,比如将要访问的页面放入一个列表,并且带有一点动态网页的效果

# -*- coding:utf-8 -*-
import socket
import time
sk=socket.socket()
sk.bind((‘127.0.0.1‘,8080))
sk.listen()

def home(url):
    with open("home.html",‘r‘)as f:
        html_msg=f.read()

    now=time.time()
    msg=html_msg.replace("uf;afsaf ",str(now))
    return bytes(msg,encoding=‘utf8‘)

def index(url):
    return b‘this is index home‘

def user(url):
    return b‘this is user page‘

url_func=[
    (‘/index/‘,index),
    (‘/home/‘,home),
    (‘/user/‘,user),

]

while 1:
    conn,client_addr=sk.accept()
    data=conn.recv(1024)
    data_str=str(data,encoding=‘utf8‘)
    url=data_str.split(‘\r\n‘)[0].split()[1]
    func=None
    for i in url_func:
        if i[0]== url:
            func=i[1]
            break
    if func:
        msg=func(url)
    else:
        msg=b"404!"
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)  #需要一个http的头
    conn.send(msg) #发送的主体,也可以放入上面的那行
    conn.close()
sk.close()

这里简单说说http协议:

端口号80 ;HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW:World Wide Web )服务器与本地浏览器之间传输超文本的传送协议。

http协议的特点:

http协议是基于TCP/IP协议之上的应用层协议。

HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回。换句话说,肯定是先从客户端开始建立通信的,服务器端在没有 接收到请求之前不会发送响应

HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议 自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个 级别,协议对于发送过的请求或响应都不做持久化处理。

服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。这个是http协议无连接的特性

http协议的请求和响应

        浏览器往服务端发的消息叫:请求(request)
            请求行  GET /index/ HTTP/1.1
            请求头  k1:v1
            \r\n
            请求体

        服务端回复给浏览器的消息叫:响应(response)
            响应行  HTTP/1.1 200 OK\r\n
            响应头  Content-Type: text/html; charset=utf-8\r\n
                    k2:v2\r\n
                    ...
            \r\n
            响应体  我们在浏览器上看到的内容

http的两种请求方式 get post

GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的请求体中.
GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
GET与POST请求在服务端获取请求数据方式不同。

查看Pycharm控制台,使用谷歌浏览器访问一次网页。实际上,是有2次请求的。

第一次,是正常请求。第二次是,favicon.ico请求,它是网页图标问题。这个请求,忽略即可。

GET的数据,是放到url后面的。POST数据是放在请求体后面的。

301重定向

永久性重定向。该状态码表示请求的资源已被分配了新的UR1,以后应使用资源现在所指的URI。也就是说,如果已经把资源对应的URI保存为书签了,这时应该按Location首部字段提示的UR1重新保存。
像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠"/",就会产生301状态码。
http://example.com/sample

302重定向

临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。

和301MovedPermanently状态码相似,但302状态码代表的资源不是被永久移动,只是临时性质的。换句话说,已移动的资源对应的URI将来还有可能发生改变。比如,用户把URI保存成书签,但不会像301状态码出现时那样去更新书签,而是仍旧保留返回302状态码的页面对应的URI。

web框架

一个web框架一般实现下面三个动能

    总结:
        a. 接收浏览器发送的消息
        b. 根据不同的路径返回不同的内容
        c. 通过字符串替换 实现 动态网页

        Python Web框架分类:
            1. 框架自带 a,b,c                  Tornado
            2. 框架自带b,c 使用第三方a        Django
            3. 框架自带b,使用第三方的a和c      Flask

        另外一个维度的分类:
            1. Django    --> 大而全
            2. 其他   

原文地址:https://www.cnblogs.com/mmyy-blog/p/9695330.html

时间: 2024-10-11 00:56:00

django之前-----web应用与框架的相关文章

Python Web 应用程序框架 Django 1.10.1 发布,bug修复

Django 1.10.1 发布了,Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 Web 应用程序框架(腾云科技TY300.COM).使用 Django,我们在几分钟之内就可以创建高品质.易维护.数据库驱动的应用程序(勤快学QKXue.NET). 该版本主要是修复1.10中的bug.更多详细信息,可参看完整发布说明. Bug修复: Fixed a crash in MySQL connections where SELECT @@SQL_AUTO_IS

利用Django构建web应用及其部署

注:很久之前就有了学习Django的想法,最近终于有机会做了一次尝试.由于Django的详细教程很多,我在这里就不再详述了,只是将整个开发流程以及自己在学习Django中的一些思考记录在此. System:CentOS Linux release 7.2.1511 (Core) Django: 1.10 Python: 2.7.5 推荐两个非常好的教程: The Django Book(中文版):我自己一开始是参考这个教程学习的,非常有意思的是这个教程中有大量的评论,几乎每段都有,从10年开始一

[Python] 利用Django进行Web开发系列(一)

1 写在前面 在没有接触互联网这个行业的时候,我就一直很好奇网站是怎么构建的.现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,但是兴趣终归还是要有的,而且是需要自己动手去实践的.Web开发的途径有好多种,比如传统的.Net,还有很火爆的Java.Python作为一种灵活好学的脚本语言,已经越来越受程序员的欢迎和热捧,甚至成为程序员的必备技能.Django是Python的Web开放框架,好多人说学习Python就是在学Django,从这也可以看出Django的强大.博主也是

如果你不知道这11款常见的Web应用程序框架 就说明你out了

本文推荐了11款常见的Web应用程序框架,并列出了相关的学习资料和下载文档.如果对这些项目还不熟悉,就赶紧学起来吧~ Rails Rails是Ruby on Rails的简称,是一款开源的Web应用框架,采用Ruby语言,其设计原则是“不做重复的事”和“惯例优于设置”,是一款更符合实际需要而且更加高效的Web开发框架.Rails是一个全栈式的MVC框架,使用它可以实现MVC模式中的各个层次,并使它们无缝地协同运转起来.除此以外,还有编写更少的代码.零周转时间等优点. 代码托管地址:https:/

使用 Python 和 Django 搭建 Web 应用

使用 Python 和 Django 搭建 Web 应用 简介 Django 是 Python 开发的 Web 框架.使用 Django 搭建 Web 应用很方便. 写本文时 django 的最新版本为 1.4,但本文不关注新版本的特性,只搭建一个简单的应用. 安装 Django 本文以 CentOS 6.2 为例进行安装: 安装 python # yum install python 本文使用的是 CentOS 6.2 Desktop,默认安装了 python. 查看一下 python 的版本

Nginx+uWSGI+Django部署web服务器

目录 Nginx+uWSGI+Django部署web服务器 环境说明 前言 搭建项目 Django部署 编辑luffy/luffy/settings.py 编辑luffy/app01/views.py 编辑luffy/luffy/urls.py 运行并测试 uWSGI部署 测试运行uWSGI 使用uWSGI运行django项目 uWSGi热加载Djangoa项目 部署nginx nginx配置uwsgi和django django部署static文件 重新加载nginx进行测试 测试nginx

Django开篇 - Web应用

一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览器,需要强调的一点是:S端由server和application两大部分构成,如图所示: 上图:Web应用组成 二 开发一个Web应用 我们无需开发浏览器(本质即套接字客户端),只需要开发S端即可,S端的本质就是用套接字实现的,如下 # S端 import socket def make_serve

Django之Web框架原理

Django之Web框架原理 为什么要学习所谓的Web框架原理 因为不管是django也好 市场上最火的什么MVC框架也好他就是基于这一套东西,来给你进行一些功能的封装让你用着特别方便,我们要做的不止是学会这些框架学框架的时候要有自己的想法,要知道这个框架的这个地方自己好像试着做也能做出来废话不多说 铁子 奥力给!! Web框架是什么 Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式.从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码

Web桌面应用框架2:著名的WEB桌面应用分析

前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是WEB窗口不同,仅在窗口的部分子窗口使用WebView,和原生UI或DirectUI结合的方式. 这种在C/C++程序里嵌入WebView的方式,由于没有一种公认.通用的框架或方法,基本是最困难和最原始的方式蛮干,或者自研平台,难以公开.但是也有很多效果很棒,很著名的软件.那么下面我们来细数一下这些