django简介,安装,文件介绍,三板斧(render,HttpResponse,redirect)HTTP协议,用socket实现简单版web框架,用wsgiref,jinja2,pymysql实现Django运行流程

1.web应用(https://www.cnblogs.com/Dominic-Ji/p/9167438.html)

c/s,b/s架构c/s:客户端 服务端b/s:浏览器 服务器?
 

2.HTTP协议:

超文本传输协议        四大特性:            1.基于TCP/IP作用在应用层之上的协议,底层实现仍为socket            2.基于请求响应:通信一定是从客户端开始,服务器端接收到客户端一定会做出对应响应            3.无状态:协议不对任何一次通信状态和任何数据做保存            4.无连接:一次连接只完成一次请求-响应,请求-响应完毕后会立即断开连接

      http工作原理(事务):

           1.客户端与服务端建立连接
           2.客户端发生一个http协议指定格式的请求
           3.服务器端接收请求后,回应一个http协议指定格式的响应
           4.客户端将服务器的响应显示展现给用户

        数据格式之请求:            请求首行            请求头(一大堆的k,v键值对)

            请求体(             GET请求,请求体里没有数据.                POST请求中多了Form Data(body中的一种表单请求类型)            所以通过实践可以得出GET与POST之间有一个body的“差距”            headers:主要存放cookie等其他信息            body:主要存放POST的一些数据,如username:xxx            )        数据格式之响应:            响应首行            响应头(一大堆的k,v键值对)

            响应体        响应状态码:            10X     服务端已经接收你的数据,正在处理,你可以继续提交数据            20X     请求成功            30X     重定向            40X     请求错误(404:请求资源不存在)(客户端错误状态码)   原因(服务器无法处理请求)            50X     内部服务器错误(服务器错误状态码)               原因(服务器处理请求错误)        

3.用socket实现简单版web框架

import socket
?
"""
请求首行
b‘GET / HTTP/1.1\r\n‘
请求头(一大堆的k,v键值对组成)
b‘Host: 127.0.0.1:8080\r\n‘
b‘Connection: keep-alive\r\n‘
b‘Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
\r\n‘
请求体
"""
server = socket.socket()
server.bind((‘127.0.0.1‘,8080))
server.listen(5)

while True:
    conn, addr = server.accept()
    data = conn.recv(1024)
    conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘)
    print(data)
    data = data.decode(‘utf-8‘)
    current_path = data.split(‘\r\n‘)[0].split(‘ ‘)[1]
    #访问http://127.0.0.1:8080/index
    if current_path == ‘/index‘:
        # conn.send(b‘<h1>hello baby!</h1>‘)
        #打开html发送到前端网页
        with open(‘01 纯手撸版本对应的html页面.html‘,‘rb‘) as f:
            conn.send(f.read())
    else:
        conn.send(b‘404‘)
    conn.close()
 

4.用wsgiref,jinja2,pymysql实现Django运行流程

4.1wsgiref启动代码文件

from wsgiref.simple_server import make_server
from urls import urls
from views import *
?
#启动文件
def run(env,response):
    print(env)  # 是个字典类型
    # 固定写法
    response(‘200 OK‘,[])  # 列表里面放的是请求首行的信息,可以不放,但是必须写
    # 获取当前用户访问路径
    current_path = env.get(‘PATH_INFO‘)
    # 定义一个函数标志位
    func = None
    for url_list in urls:  # urls:[[],[],[]]  url_list:[‘‘,func]
        #获取路由访问列表
        if current_path == url_list[0]:
            #获取列表里相对应的函数方法名称
            func = url_list[1]
            # 结束for循环了
            break
    if func:
        #调用函数
        res = func(env)
    else:
        # 匹配不上 走error
        res = error(env)
    return [res.encode(‘utf-8‘)]
?
?
if __name__ == ‘__main__‘:
    server = make_server(‘127.0.0.1‘,8888,run)
    server.serve_forever()
    

4.2user_list目录文件

from views import *
?
urls = [
    [‘/index‘,index],
    [‘/login‘,login],
    [‘/reg‘,reg],
    [‘/get_time‘,get_time],
    [‘/get_user‘,get_user],
    [‘/get_db‘,get_db_info]
]
 

4.3jinja2(可以使用模板语言渲染到页面),pymysql(连接数据库),函数响应代码

from datetime import datetime
from jinja2 import Template
import pymysql
?
?
def index(env):
    with open(‘templates/index.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()
    return data
?
def login(env):
    return ‘login‘
?
def error(env):
    return ‘404 error‘
?
def reg(env):
    return ‘reg‘
?
def get_time(env):
    ctime = datetime.now().strftime(‘%Y-%m-%d %X‘)
    # 打开文件
    with open(‘templates/get_time.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()
    #在get_time.html的body里写一个@@[email protected]@替换成当前事件
    res = data.replace(‘@@[email protected]@‘,ctime)
    return res
?
def get_user(env):
    user = {‘name‘:‘jason‘,‘age‘:‘18‘}
    with  open(‘templates/get_user.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(data=user)
    return res
?
def get_db_info(env):
    conn = pymysql.connect(
        host = ‘127.0.0.1‘,
        port = 3306,
        user = ‘root‘,
        password = ‘admin‘,
        database = ‘library‘,
        charset = ‘utf8‘,
        autocommit = True
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute(‘select * from author_view‘)
    user_list = cursor.fetchall()
    # 打开文件渲染到前端页面
    with open(‘templates/get_db_user.html‘,‘r‘,encoding=‘utf-8‘) as f:
        data = f.read()
    tmp = Template(data)
    res = tmp.render(user_list=user_list)
    return res
4.3get_db(html文件渲染)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <div class="row">
        <table class="table table-bordered table-hover table-striped">
            <thead>
                <tr>
                    <th>id</th>
                    <th>name</th>
                    <th>age</th>
                    <th>gender</th>
                    <th>nationality</th>
                </tr>
            </thead>
            <tbody>
                {% for data in user_list %}
                <tr>
                    <td>{{data.id}}</td>
                    <td>{{data.name}}</td>
                    <td>{{data.age}}</td>
                    <td>{{data.gender}}</td>
                    <td>{{data.nationality}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>
</body>
</html>
 

5.模板语言(django中使用一样,用于后端数据传送到模板语言中渲染到前台)

<!--1.用{{后台传送过来的变量名(比如data(字典的变量名))}} -->
<h1>{{ data }}</h1>
<!--1.用{{}}里用变量名.key就可以获取值显示到前台页面 -->
<!--1.其他是不同的获取方法 -->
<h1>{{ data.name }}</h1>
<h1>{{ data[‘name‘] }}</h1>
<h1>{{ data.get(‘name‘) }}</h1>
<h1>{{ data.age }}</h1>
?
<!--2.类似取python里的for循环的模板代码 -->
{% for data in user_list %}
<tr>
    <td>{{data.id}}</td>
    <td>{{data.name}}</td>
    <td>{{data.age}}</td>
    <td>{{data.gender}}</td>
    <td>{{data.nationality}}</td>
</tr>
{% endfor %}
 

6.python三大主流web框架介绍

django(大而全)flask(小而精)tornado(异步非阻塞)?a:socketb:路由与视图函数c:模板渲染??django: a用的别人的wsgiref b:自己写的  c:自己写的flask:a用的别人的werkzeug b:自己写的 c:用的别人的jinja2tornado:都是自己写的

7.django简介

注意      1.django版本    2.计算机名不能是中文    3.一个pycharm窗口就一个工程

7.1django安装

命令行下载        pip3 install django==1.11.9    命令行创建django项目        django-admin startproject mysite

    命令行创建app        #然后到cd到mysite文件夹运行下面命令        # 如果运行命令报错SyntaxError: Generator expression must be parenthesized#"C:\python\3.7\lib\site-packages\django\contrib\admin\widgets.py", line 151‘%s=%s‘ % (k, v) for k, v in params.items(),(到widgets.py文件里删除times()后面的逗号重新运行就可以)        python manage.py startapp 应用名

    命令行启动django        python manage.py runserver    用命令行创建的时候,默认没有templates文件夹,需要你自己手动创建    并且在settings配置文件中写上路径    TEMPLATES里(‘BACKEND‘下面)配置‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)]   pycharm下载    点加号 选版本    创建new project选第二个django项目(选本机环境,暂时不要选虚拟环境)    两种创建app的方式:        python manage.py startapp 应用名        tools下面的run manage.py 能够简写并自动提示        在setting里配置app路径,在INSTALLED_APPS配置‘app01.apps.AaaConfig‘,    运行方式        python manage.py runserver        pycharm自动启动

7.2django主要文件介绍

    app01        migrate 迁移        migrations  数据库迁移记录相关        models.py   orm模型类        views.py    视图函数    templates   放html文件    manage.py   django的启动入口文件    项目名下        setttings.py    django项目的配置文件        urls.py         路由与视图函数的映射关系

8.django小白必会三板斧

#HttpResponse  返回字符串
?
   # render  渲染页面并返回
?
   # redirect  重定向
?
from django.shortcuts import render,HttpResponse,redirect
?
# Create your views here.
def index(request):
    #输出字符串
    return HttpResponse(‘hello django!‘)
?
?
def login(request):
    user = {‘name‘:‘jason‘}
    #数据传输到页面显示
    return render(request,‘login.html‘,{‘user‘:user})
?
def home(request):
    #重定向到百度
    # return redirect(‘https://www.baidu.com‘)
    #重定向到/index
    return redirect(‘/index‘)
?
django默认能够自动重启,但是速度可能没有那么快
?

原文地址:https://www.cnblogs.com/jutao/p/10691655.html

时间: 2024-11-08 19:24:01

django简介,安装,文件介绍,三板斧(render,HttpResponse,redirect)HTTP协议,用socket实现简单版web框架,用wsgiref,jinja2,pymysql实现Django运行流程的相关文章

Python Django前奏手撸web框架 基于wsgiref的web框架

基于socke手撸web框架 # 请求首行 b'GET / HTTP/1.1\r\n #GET /index HTTP/1.1\r\n (index)为浏览器请求地址) # 请求头 Host: 127.0.0.1:8080\r\n Connection: keep-alive\r\n Cache-Control: max-age=0\r\n Upgrade-Insecure-Requests: 1\r\n # User-Agent用来标识是不是浏览器 User-Agent: Mozilla/5.

Django【一】web框架的本质

HTTP协议 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

Django web框架 下载安装 简单项目搭建

什么是web应用? Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件 应用程序有两种模式C/S.B/S.C/S是客户端/服务器端程序,也就是说这类程序一般独立运行.而B/S就是浏览器端/服务器端应用程序,这类应用程序一般借助IE等浏览器来运行.WEB应用程序一般是B/S模式.Web应用程序首先是“应用程序”,和用标准的程序语言,如C.C++等编写出来的程序没有什么本质上的不同.然而Web应用程序又有自己独特的地

Django框架介绍 python三大主流web框架之一

一.学习准备 1.下载安装Django(建议安装1.x版本) 方法:终端cmd输入命令:pip install django==1.11.11  然后回车即可 校验是否安装成功:django-admin 二.纯手撸web框架 1.纯手撸web框架 软件开发架构 c/s架构 b/s架构 本质bs也是cs web后端 需求: 1.根据用户输入不同的后缀返回不同的内容 从符合http协议格式的数据中获取用户输入的后缀 不足之处: 1.socket代码是我们自己写的 2.http数据也是我们自己处理的

第一篇:Django简介

动静态网页 静态网页:数据是写死的,不会变化,除非直接修改html文件 动态网页:数据是动态获取的,例如获取当前时间,或者从数据库中获取数据,当数据库中的数据被修改后,会将被修改的数据动态展示到网页中. jinja2模块 提供了一个可以在html页面上书写类似于python后端的代码 来操作数据(模板语法) 安装:pip3 install jinja2 flask框架模板语法使用的就是jinja2模块,所以你只要下了flask框架 就会自动下载jinja2 模板语法是在后端实现的,前端不识别.

django 快速实现文件上传

前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对于web应用来说,包括数据库的创建,前端页面的开发,以及中间逻辑层的处理三部分. 本系列以可操作性为主,介绍如何通过django web框架来实现一些简单的功能.每一章都具有完整性和独立性.使用新手在动手做的过程中体会web开发的过程,过程中细节请参考相关文档. 本操作的环境: ==========

Django 应用 静态文件配置

Django 应用 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> #引入静态文件夹下的bootstrap css样式 <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7/

Django初识(web框架,django下载安装,http协议)

一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了. 简单的web框架 import socket sk = socket.socket() sk.bind(('127.0.0.1',8001)) sk.listen()

Django简介--Django从入门到精通系列教程

该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453131687 教程环境:Win7/10 + Python3.6 + pip + Pycharm + Django1.11 引言 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上