初识django

初识django

简易的web框架

首先,既然是一个web框架就一定少不了socket套接字,那就先搭建一个socket套接字,因为是个b/s的架构,所以只需要写一个服务端,客户端由浏览器充当

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'HTTP/1.1 200 ok\r\n\r\n')

    conn.send(b'hello world')

    conn.close()

# data的结果
'''
#请求首行,标识遵循的协议
b'GET /abc HTTP/1.1\r\n

#请求头
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: Mozilla/5.0 (Windows NT 10.0; WOW64) 

AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36\r\n
Sec-Fetch-Mode: navigate\r\n
Sec-Fetch-User: ?1\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
Sec-Fetch-Site: none\r\n
Accept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n
Cookie: 
csrftoken=IjRfRStHOgm6vLqz4cU1dsUcMmqXkvMfsYMdBSSwpogWO9qjWG2nkedlhdEI5gaQ\r\n

# 在请求头和请求体中间要有一个换行,需要注意,面试会问
\r\n'

# 请求体

'''

如果用户访问的页面的url变了,我们又怎么去根据用户的ur来返回相应的资源?所以我们首先就要得到用户访问的url,从我们答应的data 的结果中我们可以发现,在请求首行中带有用户访问的url,

我们得到的数据是二进制的格式,所以就要先转化成字符的格式

data_str = data.decode('utf-8')

把二进制转化成字符后,我们就可以根据/r/n切割成一个列表,因为是请求首行,所以去索引0就可以得到请求头,然后再通过空格切割,取索引1就可以得到我们想要的url后缀,得到这个后缀我们就可以知道用户所访问的url

current_path = data_str.split('/r/n')[0].split(' ')[1]

得到用户访问的url后我们就可以根据这个url进行判断,然后返回相应的数据

if current_path = '/index':
    conn.send('index')
 else:
    conn.send(b'404 error')

在这个web框架中我们发现,这些东西的套路都是很固定的,如果换个人写也是差不多的,所以就一定会有一个模块来帮我i们做这件事,这个模块就是wsgiref,他能实现web服务网关接口,那么接下来就跟据这个函数来搭建

# wsgiref.py
from wsgiref.simple_server import make_server
from urls import urls
from views import *

def run(env,response):
    """
    :param env: 请求相关的所有数据 将http数据全部提前处理成了字典的形式 供调用者使用
    :param response: 响应相关的所有数据
    :return: 给前端真正的数据
    """
    # print(env)
    response('200 OK',[('xxx','jason'),])
    current_path = env.get('PATH_INFO')
  
    func = None
    for url in urls:  # url =  ('/login',login)  ('/index',index)
        if current_path == url[0]:  # 用户敲的后缀名 你后端有对应的处理业务
            func = url[1]  # 将匹配上的函数名赋值给func变量
            break  # 一旦用户匹配上了对应的业务接口 立刻结束匹配
    # 判断func是否被赋值
    if func:
        res = func(env)
    else:
        res = error(env)
    return [res.encode('utf-8'),]


if __name__ == '__main__':
    server = make_server('127.0.0.1',8080,run)  # 实时监听本机8080端口
    # 一旦有请求来了 会统一交给run函数处理(调用run函数并传参run(env,response))
    server.serve_forever()  # 启动服务端
# urls.py

from views import *


urls = [
    ('/login',login),
    ('/index',index),
    ('/reg',reg),
    ('/xxx',xxx),
    ('/get_time',get_time),
    ('/get_userdict',get_userdict),
    ('/get_data',get_data),
]
# views.py

def login(env):
    return 'login'

def index(env):
    return 'index'

def reg(env):
    return 'reg'

def xxx(env):
    # return 'xxx'
    with open(r'templates/02 xxx.html','r',encoding='utf-8') as f:
        return f.read()

def error(env):
    return '404 error'

在这些文件里

views.py 存放的是视图函数

urls.py存放的是路由与视图函数的对应关系

python三大主流的web框架

  1. django: 优点:这个框架的封装的东西很多,自带的功能非常多

    ​ 缺点:比较笨重,比较适合写大一点的项目,小项目优点大材小用

  2. flask:这个框架集成的东西不多,大部分依赖于第三方的模块,但是如果将所有的第三方模块加起来可能直接盖过django

  3. tornado:基于异步非阻塞的思想开发,这个框架很快,甚至都可以用来开发游戏的服务器

django框架介绍

jango是一个以开发app为主要功能的web框架
app就是application应用的意思

一个django项目就是一所大学(空的架子 本身没有任何功能)
而app就类似于大学里面的各个学院

一个空的django本身没有任何作用 仅仅是为app提高前期的环境配置

你可以根据功能的不同 开发多个app
一个app对应一个具体的功能模块
用户相关的功能 用户相关的app
订单相关的功能 订单相关的app
商品相关的功能 商品相关的app

每一个app都有自己独立的功能

注意事项

  1. 计算机名称不能有中文
  2. python解释最好不要使用3.7,因为有bug没解决,最好使用3.4~3.6
  3. 一个pycharm窗口只能运行一个项目

django版本

目前,django版本是以1.11.11为主,最好不要使用最新版本的工具,可能不稳定,有很多bug

django安装

pip install Django == 1.11.11

或者在settings中安装

安装后,可以在命令行中输入django-admin 来判断是否安装成功

创建django项目

基于命令行创建项目

  1. 创建django项目:django-admin startproject 项目名

  2. 启动django项目:注意要现切换到项目的目录下python manage.py runserver

    ​ 或者python manage.py runserver 127.0.0.1:8080指定端口

  3. 创建应用(app):python manage.py startapp app01(应用名称)

在使用命令行的时候需要注意,

  1. 你存放HTML的文件templates文件夹不会自动创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 需要手动添加
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

  1. 创建好的应用需要在django配置文件中注册才能使用
INSTALLED_APPS = [
			'django.contrib.admin',
			'django.contrib.auth',
			'django.contrib.contenttypes',
			'django.contrib.sessions',
			'django.contrib.messages',
			'django.contrib.staticfiles',
			# 'app01'  # 简便写法
			'app01.apps.App01Config'  # 最完整的写法
		]

通过pycharm创建

通过pycharm 创建比较简单,在pycharm中的文件选项选择新建django项目,然后填好项目的名称

通过pycharm可以默认新建一个app,填写app名称即可

和通过命令行创建一样,在新建app后也要先注册才可生效

django的项目目录

django给前端传输数据的三种方式

  1. HttpResponse 返回字符串

  2. render 返回html文件
    可以给html页面传值

    def login(request)
    	user_dic = {'username':'jason','password':'123'
    	return render(request,'login.html',{'xxx':user_dic}
    
  3. redirect 重定向

    1.直接写你本网站的路径后缀
    2.也可以全路径

     def home(request)
     	# return redirect('/login')  # 重定向
      	return redirect('https://www.baidu.com')  # 重定向
    
    
posted @ 2019-11-21 21:34  KONNE  阅读(183)  评论(0编辑  收藏  举报