058.django初识

一、django初识

(一)web应用

1.Web应用是什么

简单说就是用浏览器访问的应用程序。

# 介绍:
1)、Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。

2)、应用程序有两种模式C/S、B/S。
	C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行。WEB应用程序一般是B/S模式。Web应用程序首先是“应用程序”,和用标准的程序语言,如C、C++等编写出来的程序没有什么本质上的不同。然而Web应用程序又有自己独特的地方,就是它是基于Web的,而不是采用传统方法运行的。换句话说,它是典型的浏览器/服务器架构的产物。

2.Web应用程序的优点

1)、不需要客户端
#  网络应用程序不需要任何复杂的“展开”过程,你所需要的只是一个适用的浏览器;
#  网络应用程序通常耗费很少的用户硬盘空间,或者一点都不耗费;
2)、更新直接在服务端更新,客户端感知不到
#  它们不需要更新,因为所有新的特性都在服务器上执行,从而自动传达到用户端;
#  网络应用程序和服务器端的网络产品都很容易结合,如email功能和搜索功能;
3)、跨平台性好
#  因为它们在网络浏览器窗口中运行,所以大多数情况下它们是通过跨平台使用的 (例如Windows,Mac,Linux等等)

3.Web应用程序的缺点

1)、强调浏览器的适用性
#  网络应用程序强调浏览器的适用性。如果浏览器方没有提供特定的功能,或者弃用特定的平台或操作系统版本(导致不适用),就会影响大量用户;
#  网络应用依靠互联网远程服务器端的应用文件。因此,当连接出问题时,应用将不能正常使用。
2)、用户的数据都保存在软件厂商那边,不安全
#  许多网络应用程序不是开源的,只能依赖第三方提供的服务,因此不能针对用户定制化、个性化,而且大多数情况下用户不能离线使用,因而损失了很多灵活性;
#  它们完全依赖应用服务商的可及性。如果公司倒闭,服务器停止使用,用户也无法追索以前的资料。对比而看,即使软件制造商倒闭了,传统的安装软件也可以继续运行,尽管不能再更新或有其他用户服务;
#  相似地,提供方公司对软件和其功能有了更大的控制权。只要他们愿意就能为软件添加新特性,即使用户想等bugs先被解决再更新。跳过较差的软件版本也不可能了。公司可以强加不受欢迎的特性给用户,也可以随意减少带宽来削减开支。
#  公司理论上可以检索任何的用户行为。这有可能引起隐私安全问题。

4.B/S架构优点

​ 浏览器/服务器架构(Browser/Server,简称B/S)能够很好地应用在广域网上,成为越来越多的企业的选择。浏览器/服务器架构相对于其他几种应用程序体系结构,有如下3方面的优点:

- 这种架构采用Internet上标准的通信协议(通常是TCP/IP协议)作为客户机同服务器通信的协议。这样可以使位于Internet任意位置的人都能够正常访问服务器。对于服务器来说,通过相应的Web服务和数据库服务可以对数据进行处理。对外采用标准的通信协议,以便共享数据。
- 在服务器上对数据进行处理,就处理的结果生成网页,以方便客户端直接下载。
- 在客户机上对数据的处理被进一步简化,将浏览器作为客户端的应用程序,以实现对数据的显示。不再需要为客户端单独编写和安装其他类型的应用程序。这样,在客户端只需要安装一套内置浏览器的操作系统,直接安装一套浏览器,就可以实现服务器上数据的访问。而浏览器是计算机的标准设备。

总结一下,本质上:浏览器是一个socket客户端,服务器是一个socket服务端

(二)基于Socket写一个Web应用

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

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

1.main.py

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

server = socket.socket()

server.bind(('127.0.0.1', 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()

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="">
    
<form action="">
    <p>用户名:<input type="text"></p>
    <p>密码:<input type="password"></p>
</form>
    
</body>
</html>

(三)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
    统一资源定位符是可以从互联网上访问资源的一种方式,协议就是资源的地址

(四)Web框架

1.什么是Web框架

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

#  Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

2.基于wsgiref写一个web框架

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

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

(1) models.py

'''
链接数据库返回字典格式:
cursor=pymysql.cursors.DictCursor
'''

import pymysql
#连接数据库
conn = pymysql.connect(host='127.0.0.1',port= 3306,user = 'root',passwd='123456',db='web') #db:库名
#创建游标
cur = conn.cursor()

sql='''
create table userinfo(
        id INT PRIMARY KEY ,
        name VARCHAR(32) ,
        password VARCHAR(32)
)

'''

cur.execute(sql)

#提交
conn.commit()
#关闭指针对象
cur.close()
#关闭连接对象
conn.close()

(2) myserver.py

from wsgiref.simple_server import make_server

from urls import url_patters

def mya(environ, start_response):
    # print(environ)
    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)
        return [data]
    else:
        return [b'404']


if __name__ == '__main__':
    myserver = make_server('', 8011, mya)
    print('监听8010')
    myserver.serve_forever()

(3) urls.py

from views import *
url_patters = [
    ('/login', login),
    ('/index', index),
    ('/time', time),
]

(4) views.py

def index(environ):
    with open('templates/index.html', 'rb') as f:
        data = f.read()
    return data
def time(environ):
    import datetime
    now=datetime.datetime.now().strftime('%y-%m-%d %X')
    print(now)
    return now.encode('utf-8')
from urllib.parse import parse_qs
import pymysql
def login(request):
    if request.get("REQUEST_METHOD") == "POST":
        try:
            request_body_size = int(request.get('CONTENT_LENGTH', 0))
        except (ValueError):
            request_body_size = 0

        request_body = request['wsgi.input'].read(request_body_size)
        data = parse_qs(request_body)

        user = data.get(b"user")[0].decode("utf8")
        pwd = data.get(b"pwd")[0].decode("utf8")

        # 连接数据库
        conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='web')  # db:库名
        # 创建游标
        cur = conn.cursor()
        SQL = "select * from userinfo WHERE NAME ='%s' AND PASSWORD ='%s'" % (user, pwd)
        cur.execute(SQL)

        if cur.fetchone():

            f = open("templates/backend.html", "rb")
            data = f.read()
            data = data.decode("utf8")
            return data.encode("utf8")

        else:
            print("OK456")
            return b"user or pwd is wrong"

    else:
        f = open("templates/login.html", "rb")
        data = f.read()
        f.close()
        return data

(5) tempaltes下backend.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
登录成功
</body>
</html>

(6) tempaltes下index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
index
</body>
</html>

(7) tempaltes下login.html

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

<h4>登录页面</h4>
<form action="http://127.0.0.1:8011/login" method="post">
     用户名 <input type="text" name="user">
     密码 <input type="text" name="pwd">
    <input type="submit">
</form>
</body>
</html>

3.其它socket服务端

'cgi': CGIServer,
'flup': FlupFCGIServer,
'wsgiref': WSGIRefServer,
'waitress': WaitressServer,
'cherrypy': CherryPyServer,
'paste': PasteServer,
'fapws3': FapwsServer,
'tornado': TornadoServer,
'gae': AppEngineServer,
'twisted': TwistedServer,
'diesel': DieselServer,
'meinheld': MeinheldServer,
'gunicorn': GunicornServer,
'eventlet': EventletServer,
'gevent': GeventServer,
'geventSocketIO':GeventSocketIOServer,
'rocket': RocketServer,
'bjoern' : BjoernServer,
'auto': AutoServer,

​ 都遵循一个协议wsgi(Web Server Gateway Interface web服务网关接口)

(五)Django简介

1.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:自己写的

2.django安装与简单使用

(1) 下载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 project

1 装完以后,会多个一个django-admin的命令,在D:\python38\Scripts 路径下
    由于D:\python38\Scripts之前就被加入到环境变量,在任意路径指向django-admin都能找到
        
2 django-admin是用来创建django项目的命令(创建项目就是生成目录,生成一堆py文件)

3 创建项目(在哪个路径下指向,项目就创建在哪,在c盘根路径)
	django-admin startproject 项目名
    django-admin startproject myfirstdjango

4 创建完以后,用pycharm打开即可

	
5 django目录结构之关键目录
	-views.py:    函数,视图函数
    -urls.py:     路径(路由)和视图函数的对应关系,负责把URL模式映射到应用程序。
    -models.py:   表模型(数据库操作相关)
	-manage.py:   Django项目里面的工具,通过它可以调用django shell和数据库等。
	-settings.py: 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。

8 最简单的方式,通过pychrm创建
    
    
100:可能遇到的问题
	1 如果计算机名是中文,项目路径中有中文空格,都可能会报错
    2 python3.7或者3.8 对django1.x的版本兼容性可能存在问题,1.x版本推荐用python3.6
(在哪个路径下指向,项目就创建在哪,在c盘根路径)	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值