Django学习之路

基础web框架的实现

1.纯手撸web框架。

  1、手动书写socket代码

  2、手动处理http数据

#socket套接字
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)
    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]
    # print(current_path)
    if current_path == '/index':
        # conn.send(b'index')
        with open(r'D:\python脱产10期视频\day51\01 纯手撸html文件.html','rb') as f:
            conn.send(f.read())
    elif current_path == '/login':
        conn.send(b'login')
    else:
        conn.send(b'hello world!')
    conn.close()
#类型转换
data = b'hello world'

data = str(data,encoding='utf-8')
print(data)

data = bytes(data,encoding='utf-8')
print(data)

2.基于wsgiref模块帮助我们处理scoket以及http数据

  wsgiref模块

    1、请求来的时候,解析http数据,帮你打包成一个字典传输给你,便于你操作各项数据。

    2、响应走的时候,自动帮你把数据再打包成符合http协议格式的样子,再返回给前端

def run(env,response):
    """
    env是请求相关的数据
    response是响应相关的数据
    """
    # print(env)
    response('200 OK',[])
    current_path = env.get('PATH_INFO')
    # print(current_path)
    # if current_path == '/index':
    #     return [b'index']
    # elif current_path == '/login':
    #     return [b'login']
    # 定义一个存储函数名的标志位
    func = None
    for url in urls:
        # 判断当前url在不在元组内
        if url[0] == current_path:
            # 只要匹配上了  就把url后缀对应的函数名赋值给func
            func = url[1]
            # 一旦匹配上 应该立刻退出for循环 节省资源
            break
    # 对变量func做判断
    if func:
        res = func(env)
    else:
        res = errors(env)
    return [res.encode('utf-8')]


if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)
    # 实时监测127.0.0.1:8080地址 一旦有客户端来连接 会自动加括号调用run方法
    server.serve_forever()  # 启动服务端

3.封装路由与视图数对应关系,以及视图函数文件,网站用到的所有html文件全部放在了templates文件夹下

  1、urls.py路由与视图函数对应关系

  2、views.py视图函数(视图函数不单单指函数,也可以是类)

  3、templates模板文件夹

#urls
from 代码.views import *

urls = [
    ('/index',index),
    ('/login',login),
    ('/reg',reg),
    ('/get_time',get_time),
    ('/get_user',get_user),
    ('/get_db',get_db),
]
#views
def index(env):
    return 'index'
def login(env):
    return 'login'
def errors(env):
    return '404 error'

def reg(env):
    return 'reg'

from datetime import datetime


def get_time(env):
    # 借助于时间模块 现在后端获取到时间数据
    current_time = datetime.now().strftime('%Y-%m-%d %X')
    with open(r'templates/02 get_time.html','r',encoding='utf-8') as f:
        data = f.read()  # data其实就是一串字符串  仅此而已!!!
    data = data.replace('$$time$$',current_time)
    return data



from jinja2 import Template
def get_user(env):
    user_dict = {'username':'jason','password':'123','hobby':['read','game','running']}
    with open(r'templates/03 get_user.html','r',encoding='utf-8') as f:
        data = f.read()
    temp = Template(data)
    res =  temp.render(data = user_dict)  # 将user_dict传递给前端页面 前端页面通过变量名data就能够获取到该字典
    return res

import pymysql
def get_db(env):
    conn = pymysql.connect(
        host = '127.0.0.1',
        port = 3306,
        user = 'root',
        password = '123',
        database = 'day51',
        charset = 'utf8',
        autocommit = True
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    sql = "select * from userinfo"
    affect_rows = cursor.execute(sql)
    data = cursor.fetchall()
    # print(data)
    with open(r'templates/04 get_db.html','r',encoding='utf-8') as f:
        data1 = f.read()
    temp = Template(data1)
    res = temp.render(user_list= data)
    return res

4.基于jinja2实现模板的渲染

  模板的渲染

    后端生成好数据,通过某种方式传递给前端页面使用(前端页面可以基于语法更加快捷简便使用后端传过来的数据)

python三大主流web框架介绍和分析

1.Django:大而全 自带的功能特别特别多 就类似于航空母舰 有时候过于笨重

2.Flask:短小精悍 自带的功能特别特别少 全都是依赖于第三方组件,flask框架第三方的组件特别多,如果把flask第三方全部加起来 完全可以盖过Django,比较受限于第三方的开发者

3.Tornado:天生的异步非阻塞框架 速度特别快 能够抗住高并发,可以开发游戏服务器

A:socket
B:路由与视图函数匹配
C:模板语法

Django
       A:用的别人的 wsgiref
       B:自己写的
       C:自己写的
Flask
       A:用的别人的 wsgiref>>> werkzeug
       B:自己写的
       C:用的别人的 jinja2
Tornado
       A,B,C全都是自己写的

Django的使用

"""
版本问题:
django版本问题1.x和2.x(本次以1.11.11为学习对象)
注意事项:
    1.你的计算机的名称不能有中文
    2.文件的命名尽量也不要用中文
    3.一个pycharm窗口只能有一个项目 不要把多个项目放在一个窗口下
"""

Django的下载与安装

#django下载
#命令行内敲:
    pip3 install django==1.11.11
#确认是否下载成功
#命令行内敲:
    django-admin

Django的项目创建

命令行式

  1.命令行创建django项目

    django-admin startproject 项目名

  2.命令行内创建django应用(一个应用对应一块独立的功能)

    django-admin startapp 应用名

    python manage.py startapp 应用名

  3.命令行启动django项目

    python manage.py runserver

注意 :用命令行创建django项目 不会自动新建templates模板文件夹,需要你自己手动创建 并且需要你自己去settings.py文件中注册该文件路径

pycharm快捷方式

创建Django项目

创建Django项目

一:

 

 

 二:

 

 

 

(******)
创建的应用一定要在settings中注册 才能生效 否则无法识别

 如果没有配置temlates路径也要手动添加

启动django项目

 

 

 Django创建完成后的页面

 django的主要文件夹介绍

项目名文件
  同名的项目文件夹
    settings.py django暴露给用户可配置的文件
    urls.py 路由与视图函数对应关系
  manage.py django入口文件
  应用文件夹
    migrations文件夹 数据库迁移记录
    admin.py django后台管理
    apps.py 应用注册相关
    models.py orm模型类
    tests.py 测试文件
    views.py 视图函数

Django基础必备三件套:

from django.shortcuts import HttpResponse, render, redirect

HttpResponse

内部传入一个字符串参数,返回给浏览器。

例如:

def index(request): # 业务逻辑代码 return HttpResponse("OK")

render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)

例如:

def index(request): # 业务逻辑代码 return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

redirect

接受一个URL参数,表示跳转到指定的URL(重定向)。

例如:

def index(request): # 业务逻辑代码 return redirect("/home/")
posted @ 2019-09-14 13:17  云上fly  阅读(373)  评论(0编辑  收藏  举报