Python基础day53 Django

web应用的简介

因为Django框架是一个专门用来开发web项目的框架

1. web应用程序是什么?

  web应用程序是一种可以通过web访问的应用程序,也就是说只需要一个浏览器即可,不需要其他软件了

2. 应用程序与有两种模式

    Django就是开发的B/S应用程序,所以,我们就认为浏览器就是我们的客户端、Django框架就是服务端

3. web应用程序的优点

  1. 只需要一个浏览器即可,不需要安装其他应用软件

  2. 节省用户的空间资源

  3. 他们不需要更新,因为服务端只要已更新版本,会直接影响客户端的更新

  4. 跨平台使用

4. web应用程序的缺点

  一旦web应用的服务端宕机,直接影响客户端的正常访问

自制简单的web框架(推到框架的演变、重点理解思路)

web应用程序主要就是B/S架构的,浏览器就是客户端、我们现在开发出一个服务端出来即可

可以认为框架就是客户端的服务端

  通过socket写一个服务端出来

HTTP协议相关知识

 1. 四大特性

  基于请求和响应

  基于TCP协议之上的应用层协议

  无状态

  短连接

2. 请求数据格式

  请求首行(请求方式、协议版本号)

  请求头

  \r\n

  请求体

3. 响应数据格式

  响应首行(响应状态码)

  响应头

  \r\n

  响应体

4. 响应状态码

  1xx

  3xx

  3xx

  4xx

  5xx

socket服务端

import socket

server = socket.socket()
server.bind(('127.0.0.1', 8000))
server.listen(3)
while True:
    # 接收数据
    sock, addr = server.accept()
    # 拿到客户端发来的数据
    data = sock.recv(1024)  # bytes类型的
    print(data.decode('utf-8'))
    # 给客户端回消息
    # 发送符合HTTP协议的数据格式
    sock.send(b'HTTP/1.1 200 OK \r\n\r\n')  # 流式协议特性
    sock.send(b'hello django')
    sock.close()

如何做到在浏览器地址栏中写什么后缀就返回什么内容?

思路:

  1. 在后端需要知道在浏览器输入了什么内容

  2. 判断是什么后缀就返回什么内容

    conn.send(b' ')

浏览器每次朝后端发起请求的时候,都会多一次:/favicon.ico

设置浏览器标题栏的小图标:

<link rel="shortcut icon" href="https://csdnimg.cn/public/favicon.ico" >

href后面填图标的地址

借助于wsgire模块(内置模块,直接使用)

from wsgiref.simple_server import make_server
from urls import urls
from views import error
'''
views:def index():
            return 'index'
urls:
urls = (
    ('/index', index),
    ('/login', login),
    ('/func', func),
    ('/home', home),
)
'''

'''
解决了socket部分,不用我们自己写了,在wsgiref模块中人家帮我们写了
它解决了并发问题 WSGISever类------>wsgiref--------->它能够解决的并发量不高
------>本地使用wsgiref服务器-------->代码上线后,就不用他
-------->uwsgi服务器(它支持的并发量更高)
代码上线之后会使用 Nginx + uwsgi
'''


def run(env, response):
    """
    :param env: 客户端每次发起请求的时候,所携带的数据都在这个里面,就类似属于是request
    :param response: 是后端给浏览器返回的数据
    :return: 返回给浏览器查看的
    """
    print(env)  # 把HTTP格式的数据都封装到了大字典中去了
    response('200 OK', [])
    # 我们取到当前的后缀内容
    current_path = env.get('PATH_INFO')
    # 做判断
    # if current_path == '/index':
    #     return [b'index']
    # elif current_path == '/login':
    #     return [b'login']
    # else:
    #     return [b'404 error']

    func_name = None
    for url in urls:
        if current_path == url[0]:
            func_name = url[1]

    if func_name:
        res = func_name()
        return [res.encode('utf8')]
    else:
        res = error()
        return [res.encode('utf8')]


if __name__ == '__main__':
    server = make_server(host='127.0.0.1', port=8000, app=run)
    """
        这句话写完就会实时监听127.0.0.1:8000这个地址
        只要有客户端来访问这个地址,那么,我服务端就能够接收到客户端的请求, 就类似于是我们的socket端

        app=run:只要有客户度发过去请求,那么就会把处理的请求交给run这个函数来处理,run是个函数名(在django中用的就是函数名)

        后面你要学的flask框架这个地方写的是对象,而不是函数名
        obj()-------------->会触发类的__call__方法--------->flask框架的启动代码就在__call__里面写着的,是入口
    """
    server.serve_forever()

"""
分文件存放
views.py----------------->视图文件--------->主要就是写后端的逻辑的
urls.py------------------>路由文件(后缀)---------->路由与视图函数的对应关系
templates---------------->专门用来存储html文件的
"""

# 以后我们要想增加一个后缀,只需要在urls.py中写一个路由和在views.py中写一个视图函数即可.
    

 

Django框架的学习

Django是Python中使用最多的一个主流框架!

python中的主流框架:
    Django:
           # 主要用来开发web项目的,它比较笨重,一般小型项目不怎么使用它,大而全
    flask:
        # 它是一个比较轻量级的框架,它主要依赖于第三方的模块,不断的安装第三方模块,小而精
    tornado:
         # 异步非阻塞,解决高并发比较擅长
         # 这个框架学起来有点难度.
    ...
# 版本问题:
1.X(老项目) 2.X(新项目) 3.X(新版本)
1.x和2.x本质上差别不是很大,但是也有区别,我们讲1.x,附带讲2.x的区别
# 在drf中,都要使用2.x以上版本,drf这个框架要求django的版本必须是2.x以上

# 注意事项:
1. 你的项目名称和应用名称以及其他文件的名称都要使用英文的,坚决不能够使用中文的
2. 你的计算机名称最后都使用英文的
3. 一个pycharm窗口只打开一个django项目,不能够一个窗口打开很多个django项目

# 如何使用Django
1. 安装django
pip install django==1.11
# django版本要和解释器的版本要匹配:
django2.X版本------------>解释器的版本最后3.6以上

# 如何验证django是否安装成功
在cmd中输入:django-admin------>如果有输出内容就说明安装成功

2. 创建项目
    # 1 命令行创建
        """你可以先切换路径,切换到你想把django项目放到的路径里"""
        django-admin startpeoject 项目名
        django-admin startproject myfirst_dj
    # 2 pycharm创建
        File
                New Project
                        django
                                ...
3. 如何启动项目
    # 1. 命令行启动
        先把路径切到manage.py所在的路径
        python3 manage.py runserver 
        """项目启动起来之后,会监听:http://127.0.0.1:8000/"""
        默认端口号是:8000
        如何修改端口号:
            python3 manage.py runserver 127.0.0.1 8001
        
    # 2. pycharm启动
        点击绿色按钮
    # 访问项目: http://127.0.0.1:8000/
    
4. Next, start your first app by running python manage.py startapp [app_label].
"""创建应用"""

# 如何创建应用
    1. 命令行创建
        python manage.py startapp [app_label].
        python manage.py startapp app01.
    2. pycharm创建

    
    
# 当你把应用创建出来之后,紧接着要做的一件事情就是:注册应用
# 在配置文件中注册应用,这个应用才生效
****************************************************************************************
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 全称
    'app01',  # 简称
]
****************************************************************************************

# 以后我们在哪里写代码呢?
views.py
urls.py

 主要文件介绍

myfirst_dj        # 项目名称
    app01        # 应用名称
        migrations    # 这个是用来存储数据库迁移记录
        __init__.py
        admin.py    # 跟后台项目注册等相关的
        apps.py        # 跟一些注册相关
        models.py    # 跟数据库打交道的 模型层----->MTV模型
        tests.py     # 测试文件
        views.py    # 视图文件,写一些后端逻辑
myfirst_dj
    __init__.py
    settings.py        # 配置文件相关的
    urls.py            # 路由相关的
    wsgi.py            # 内部封装的wsgiref服务器,uwsgi服务器之后,这个文件就没用了uwsgi.py
    db.sqlite3        # Django自带的小型数据库
manage.py            # Django框架的入口文件

应用

# django主要开发的就是一款web应用!
Django框架类似于是一所大学(空壳子)

应用就是大学里面的二级学院(具备独立的功能模块)
# 一个应用就是一个独立的功能模块
比如:
    user
    order
    address
    cart
    ...
# 应用名一定要见名知意,但是我们教学为了方便,我都使用app01、02、03...

小白必会三板斧

# The view app01.views.index didn't return an HttpResponse object. It returned None instead.

from django.shortcuts import render, HttpResponse, redirect

return HttpResponse("OK")  # 返回字符串的
return render(request, 'index.html')  # 返回html文件的
return redirect('http://www.baidu.com') # 重定向

###############################自己创建的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',
            ],
        },
    },
]

###############################自己创建的templates文件夹,要在配置文件注册################

 

posted @ 2023-07-26 20:19  吼尼尼痛  阅读(3)  评论(0编辑  收藏  举报