Django学习之路

Stella981
• 阅读 733

基础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学习之路

创建Django项目

一:

Django学习之路

二:

Django学习之路

 Django学习之路

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

Django学习之路

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

Django学习之路

启动django项目

Django学习之路

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/")

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Java修道之路,问鼎巅峰,我辈代码修仙法力齐天
<center<fontcolor00FF7Fsize5face"黑体"代码尽头谁为峰,一见秃头道成空。</font<center<fontcolor00FF00size5face"黑体"编程修真路破折,一步一劫渡飞升。</font众所周知,编程修真有八大境界:1.Javase练气筑基2.数据库结丹3.web前端元婴4.Jav
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这