day59 Django第一天

今日内容

1 web应用

1 用浏览器访问的应用程序
2 优点:
	-不需要客户端
    -更新直接在服务端更新,客户端感知不到
    -跨平台性好
3 缺点:
	-强调浏览器的适用性
    -用户的数据都保存在软件厂商那边

2 bs、cs架构

1 bs:浏览器---服务端   (本质还是cs)
2 cs:客户端---服务端

3 手写一个web应用

1 客户端是浏览器,服务端自己写(python)


2 静态页面,动态页面
	-静态页面:静态的html,内容不会改变,每次访问看到的数据都一样
    -动态页面:页面的数据会发生变化,每次访问看到的可能都不一样(数据来源可能是数据库)

3.1 main.py

# 1 写一个web应用的服务端,通过浏览器(客户端),来访问

import socket

server = socket.socket()

# server.bind(('127.0.0.1', 8080))
server.bind(('0.0.0.0', 8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    # 接收浏览器传过来的数据
    data = conn.recv(1024)
    print(data)
    # 返回给浏览器数据(不符合http协议)
    # conn.send(b'hello world')
    # 返回数据符合http协议
    # conn.send(b'HTTP/1.1 200 ok \r\n\r\n hello world')

    # 返回符合html格式的数据
    # conn.send('HTTP/1.1 200 ok \r\n\r\n <h1>title</h1>'.encode('utf-8'))

    ## 返回一个html页面,打开文件,转成二进制,send一下
    # with open('index.html','r',encoding='utf-8') as f:
    #     data=f.read()
    #
    # response='HTTP/1.1 200 ok \r\n\r\n %s'%data
    # conn.send(response.encode('utf-8'))

    ## 实现动态页面(静态页面,动态页面)
    # 在index.html中写一个特殊标记,使用python的变量去替换这个特殊标记
    import time
    ctime=time.time()  # 可能是数据库查询出来的
    with open('index.html','r',encoding='utf-8') as f:
        data=f.read().replace('{
    
    {time}}',str(ctime))
    response='HTTP/1.1 200 ok \r\n\r\n %s'%data
    conn.send(response.encode('utf-8'))


    conn.close()

3.2 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{
   
   {time}}
<br>
<br>

<img height="100" width="100" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1601009198247&di=b7b696110501b0e1ba3b5c508335c7b2&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201509%2F29%2F20150929213123_Mvy4S.jpeg" alt="">
</body>
</html>

4 http协议

1 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网服务器与本地浏览器之间传输超文本的传送协议
2 应用层的协议
3 http协议特性(记一下)
	-1 基于tcp/ip之上的应用层协议
    -2 基于请求-响应模式
    -3 无状态保存
    -4 无连接
4  请求协议(浏览器发出来的)(记住)
三部分:请求首行,请求头,请求体

'''
# 请求首行(以第一个\r\n区分的),
# 请求方式:GET  请求地址:/lqz/handsome   协议:http   版本:1.1版本
GET /lqz/handsome HTTP/1.1\r\n

# 请求头(key:value形式)
Host: 192.168.11.211:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n'

# \r\n\r\n  下面的是请求体的内容

'''
5 响应协议
'''
# 响应首行  响应协议和版本:HTTP/1.1  响应的状态码和标志:200 ok  
HTTP/1.1 200 ok \r\
# 响应头(key:value形式)
key:value
key:valu
\r\n\r\n
# 响应体:在浏览器里看到的东西(浏览器能把下面的html渲染成好看的样子)

<!DOCTYPE html>
<html lang="en">
<h1>hello</h1>
</html>
'''

6 响应状态码
	-1xx:请求正在处理(用户一般看不到)        
    -2xx:请求成功(200-3xx:重定向(301  302)访问一个地址,转到另一个地址
    -4xx:客户端错误(404403-5xx:服务端错误(5027 url:统一资源定位符
	# 格式
    http://127.0.0.1:8080/order.html
    ftp://xxx
    协议://IP:端口(80)/路径?name=lqz&age=18
    统一资源定位符是可以从互联网上访问资源的一种方式,协议就是资源的地址

5 web框架

1 web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率

6 基于wsgiref写一个web框架

1 socket自己写的,借助于一个模块,已经实现了socket
2 wsgiref:django默认使用的

3 在web框架上继续开发
	-以后路径都去urls.py中写
    -路径匹配以后执行的函数,都放在views.py
    -数据库相关操作,在models.py中

7 django与其他web框架区别

1 python中主流web框架:django,flask,tornado(性能高),sanic,fastapi。。。。。
socket假设叫:a
路由的映射关系:b
模板渲染:     c
自己写的web框架:  a:用了第三方wsgiref  b:自己写的  c:自己写的
django:         a:用了第三方wsgiref   b:自己写的  c:自己写的
flask            a:用了第三方          b:自己写的  c:用了第三方
tornado          a:自己写的           b:自己写的  c:自己写的

8 django安装与简单使用


0 django的版本:1.x  2.x  3.x  版本之间是由差距的
1 安装的几种方式
	-在cmd中敲:pip3 install django==1.11.9         默认装最新版本(3.x)
    -pycharm中--》setting--》解释器--》点+号,选择版本,安装
    -pycharm的Terminal中敲  pip3 install django==1.11.9 
    
2 装完以后,会多个一个django-admin的命令,在D:\python38\Scripts 路径下
    由于D:\python38\Scripts之前就被加入到环境变量,在任意路径指向django-admin都能找到
        
3 django-admin是用来创建django项目的命令(创建项目就是生成目录,生成一堆py文件)

4 创建项目(在哪个路径下指向,项目就创建在哪,在c盘根路径)
	django-admin startproject 项目名
    django-admin startproject myfirstdjango
5 创建完以后,用pycharm打开即可
6 在项目根路径创建app
	python3 manage.py startapp app名字

	
7 django目录结构
	-views.py:函数,视图函数
    -urls.py:路径(路由)和视图函数的对应关系
    -models.py:表模型(数据库操作相关)


8 最简单的方式,通过pychrm创建
    
    
100:问题
	1 如果计算机名是中文,项目路径中有中文空格,都可能会报错
    2 python3.7或者3.8 对django1.x的版本兼容性可能存在问题,1.x版本推荐用python3.6

使用wsgiref实现web服务

from wsgiref.simple_server import make_server

def server(environ, start_response):  # 必须传两个参数
    # environ:是字典,http请求拆成字典,请求方式,请求地址,请求头。。。
    # start_response:响应对象,响应状态码,响应头放到里面

    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':  # 请求地址
        data='我是index页面'.encode('utf-8')

    elif environ.get('PATH_INFO') == '/login':
        data='我是login页面'.encode('utf-8')
    else:
        data = b'<h1>Hello, web!</h1>'
    return [data]

if __name__ == '__main__':
    # app是可调用对象,可以加括号执行的(函数内存地址)
    myserver=make_server('127.0.0.1',8081,server) # 只要客户端发送一次请求,就会调用server()
    myserver.serve_forever()  # 服务就起来了,相当于之前写的socket一直监听8081端口

自己写的Web框架

在这里插入图片描述

1.myserver.py

from wsgiref.simple_server import make_server
from urls import url_patters


def server(environ, start_response):  # 必须传两个参数
    start_response('200 OK', [('Content-Type', 'text/html')])
    func=None
    for item in url_patters:
        if item[0] == environ.get('PATH_INFO'):
            func = item[1]
            break
    if func:
        data = func(environ, start_response)
    else:
        data='error'.encode('utf-8')

    return [data]


if __name__ == '__main__':
    myserver = make_server('127.0.0.1', 8081, server)
    myserver.serve_forever()

2.urls.py

路径和函数对应关系
from views import *
url_patters = [
    ('/login', login),
    ('/index', index),
    ('/time', time),
    ('/order', order),
]

3.views.py

def login(environ, start_response):
    with open('templates/login.html', 'rb') as f:
        data = f.read()
    return data


def index(environ, start_response):
    with open('templates/index.html', 'rb') as f:
        data = f.read()
    return data


def time(environ, start_response):
    import time
    with open('templates/time.html', 'r', encoding='utf-8') as f:
        data = f.read().replace('{
    
    {time}}', str(time.time()))

    return data.encode('utf-8')


def order(environ, start_response):
    return 'order'.encode('utf-8')

4.models.py

以后跟数据库交互,在这写

命令行创建
在这里插入图片描述
pycharm创建在这里插入图片描述

作业

1 搜索一下http的状态码有哪些?分别代表什么意思?

2 http的请求头和http的响应头有哪些,分别代表什么意思?

3 django框架安装好,跑起一个helloworld

4 上课讲的整理成比较,发博客

5 扩展:

​ -在django中实现访问index,返回一个页面(好看的页面,放个图)

​ -在django中实现访问login,返回一个登录页面(form表单,可以写的好看一些)

猜你喜欢

转载自blog.csdn.net/yinlingjishu/article/details/108829557