首页 > 其他分享 >web框架-django框架

web框架-django框架

时间:2022-09-04 17:59:08浏览次数:50  
标签:web 框架 py request django path 数据 路由

目录

web框架

1.定义:是一种开发框架 用来支持动态网站、网络应用程序及网络服务的开发(专门为web服务器处理动态资源请求的应用程序)
注:web服务器:一般指网站服务器 驻留与因特网上某种类型计算机的程序
    web服务器只能处理静态资源 web服务器通过WSGI协议把动态资源交给web框架操作 读取空模板与数据库数据查找整合成一个完成网页 通过WSGI协议返回服务器
2.种类:基于请求
        基于组件

编写web框架模块

1.socket模块 
  代码重复操作
2.wsgiref模块:对socket模块重复代码进行封装
  请求方式数据获取采用函数进行封装
  获取网址后缀方式采用路由匹配(网址后缀名,函数名) 网址后缀名一旦匹配上就执行后面的函数

动静态网页

1.静态网页:网页数据是直接固定的 不会依赖别的数据的改变而改变 更改只能修改源代码
2.动态网页:网页数据不是直接固定写好的 数据动态来源于动态获取(后端传入) 后端数据修改 则页面数据更改

jinjia2模块

1.定义:能够在html文件中使用类似于后端的语法操作各种数据类型(第三方模块)
2.功能:
  HTML加载
    1、在main文件同级目录创建templates目录
    2、在目录当中编写HTML文件
    3、导入render_template方法
    4、使用render_template方法加载HTML文件
    5、将加载的内容返回
  HTML数据渲染:把python视图函数当中的数据传递到HTML上
	{{}}     变量
    {%%}     标签(end)
    {{|}}    过滤器

python主流web框架

1.django框架
2.flask框架
3.tornado框架
4.fastapi框架
5.sanic框架

django框架

版本

1.x同步
2.x同步
3.x异步

下载安装

1.下载安装:pip install django==版本
2.验证是否下载成功:cmd终端操作django-admin

操作

1.启动注意事项:
  计算机名称尽量不要使用中文
  项目中的py文件名不要使用中文
  不同版本的django框架与不同版本的python解释器配合可能会出现报错
  一个pycharm窗口只允许有一个项目
2.在命令行执行项目启动操作:
  2.1 创建项目:django-admin startproject 项目名
  2.2 启动django项目:切换项目 cd 项目名
      启动目录:python manage.py runserver ip:port
  2.3 创建app应用:
3.pycharm执行项目启动操作:鼠标点

目录结构

1.目录
同名文件夹:
			__init__  冷门配置
    		settings.py  配置文件
             urls.py   路由匹配
             wsgi.py   django服务
             manage.py  入口文件
            python manage.py runserver ip:port
             templates文件夹   储存html文件夹
应用名文件夹:
			db.sqlite3   django自带小型数据库
             __init__     冷门配置
             admin.py     django自带的后台管理
             apps.py      用于应用注册
             models.py    存储与数据库表相关的类 
             tests.py     自带测试文件
             views.py     逻辑代码(视图层)
             migrations文件夹  orm相关(与数据库打交道)
             python manage.py makemigrations
             python mansge.py migreat
2.层
  urls.py          路由层
  views.py         视图层
  templates文件夹   模板层
  models.py         模型层

三板斧

1.HttpResponse   返回字符串数据
2.render         返回html页面 支持模板语法
3.redirect       重定项

静态文件操作

1.存储:static文件夹
2.种类:html页面上不经常改变的文件、css、js、第三方框架文件、图片文件
3.访问:在settings配置文件中添加static文件夹路径
4.接口前缀动态改变:
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-distt/css/bootstrap.min.css' %}" >

form表单

1.请求类型:
 get:form表单默认请求 向别人索要数据  可以携带一些不重要数据(没有请求体) 数据大小2KB~4KB左右
 post:向别人提交数据 可以携带数据(请求体)
2.修改数据请求:form表单method="post"
  注需要注释settings配置文件夹中的代码:
     MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware',]

request对象方法

1.request.mothod  获取请求类型
2.request.GET    获得get请求发送的字典数据(对象)
3.request.GET.get()   获取get请求中的最后一个数据
4.request.GET.getlist() 获取整个get请求整个列表
5.request.POST    获得post请求发送的字典数据(对象)
6.request.POST.post()   获取post请求中的最后一个数据
7.request.POST.postlist() 获取整个get请求整个列表

MySQL数据库连接

1.pycharm连接MySQL数据库:通过databases库 第一次需要下载插件及对应驱动
  pycharm可以操作简单的数据的增删改查
2.django连接MySQL数据库:
  配置文件中配置MySQL数据库基本数据(库名、ip、端口、用户名、密码、编码)
  下载连接mysql的第三方模块:mysqlclient

ORM

1.定义:对象关系映射
  类       表
  对象     记录
  对象属性  值
2.ORM语法操作:models.py文件下编写
3.数据库的迁移/同步操作
  python manage.py makemigrations
  python manage.py migrate
4.表的主键在orm可以不写 orm会自动创建一个id主键

数据库操作

1.增:mondels.Info.object.create(字段) == create table info(字段)
2.改:mondels.Info.object.filter(筛选) update(新值) == update 表名 set 字段名=新数据 where 筛选条件
3.删:models.Info.object.filter(筛选) delete == del from 表名  where 筛选条件
4.查:models.Info.object.filter() == select 字段1,字段2 from 表名;

生命周期流程图

image

路由层

路由匹配

1.操作文件:urls.py
2.路由匹配:(网址后缀名,函数名)
  网址后缀名一旦匹配上就执行后面的函数
3.访问时网址后缀/可以不写:django会做二次匹配(第二次加/)
4.转换器:网址后缀名后面还有确定数据类型的数据时 可以使用转换器类型进行数据的匹配
          转换器匹配到的内容会当做视图函数的关键字参数 转换器与视图函数参数要一一对应
5.匹配类型:
  5.1 路由匹配:
      path('func/<int:year>/<str:info>/',views.func)
      def func(request,year,info):
          pass
   5.2 正则匹配:
       re_path('^text/$',views.text)
      5.2.1 有名分组(正则起名?P): re_path('^text/(?P<year>\d+)/(?P<other>.*?)/',views.text)
      5.2.2 无名分组:re_path('^text/(\d+)/(.*?)/',views.text)

注:django1.11只支持正则匹配 url()

​ django2、3、4中path() re_path() == url()

反向解析

1.原因:当网址后缀名在路由中写死后 已在html页面应用 当在路由匹配中做修改的话 html对应的数据会失效 若需要修改只能一条一条修改 因此可以使用反向解析操作
2.定义:返回一个结果 该结果可以访问到对应的路由(在路由匹配时对网址后缀名起别名)
3.语法:
  html页面:
          {% url 'reg_view' %}
  后端:
          from django.shortcuts import reverse
          reverse('reg_view')
  注:反向解析不同转换器方法一样(path()、re_path()、ulr())
4.有名无名反向解析:当网址后缀后面还有不确定的数据时 
  有名转换器:
      path('reg/<str:info>/', views.reg, name='reg_view')
      reverse('reg_view', args=('lili',))
      {% url 'reg_view' 'lili' %}
   无名转换器:
  注:有名无名反向解析不同转换器方法一样(path()、re_path()、ulr())

路由分发

1.原因:总路由及静态文件与templates文件夹负责django中所有应用的的数据的话 整体数据比较混乱且数据量大 因此django中的应用可以有自己独立的urls.py templates文件夹 static文件夹
 2.优点:能够让基于django开发的多个应用完全独立 便于小组开发
 3.总路由:
  path('app01/',include('app01.urls')).
  path('app02/',include('app02.urls'))
 子路由:
  path('after/',views.after) # app01
  path('after/',views.after) # app02
 注:当项目特别大时 可以使用路由分发

名称空间

1.原因:有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
2.解决方式:
  方式一:名称空间 namespace
          path('app01/', include(('app01.urls', app01),namespance='app01'))
          path('app02/', include(('app02.urls', app01),namespance='app02'))
  方式二:别名不冲突(在别名前加应用名)

网页伪静态

1.原因:提升网页被搜索及展示的概率
2.定义:欺骗浏览器认为该网页是静态网页 数据不经常改变 使浏览器收录该网页
3.操作:将网址后缀名以文件的后缀名展示

视图层

视图函数返回值

1.返回值类型:HttpResponse对象
2.三板斧返回均为HttpResponse对象
  rander返回的是HttpResponce对象:return HttpResponse(content, content_type, status)
  redirect返回是HttpResponse对象:redirect_class = HttpResponsePermanentRedirect if permanent else HttpResponseRedirect
    					return redirect_class(resolve_url(to, *args, **kwargs))
  HttpResponse是一个类: class HttpResponse(HttpResponseBase):

序列化

1.分类:
  json方法:
    (ensure_ascii=False)
       import json

       def mylist(request):
            info = {'name': 'lili童鞋', 'age': 22}
            # l1 = json.dumps(info)        # {"name": "lili\u7ae5\u978b", "age": 22}
            l1 = json.dumps(info, ensure_ascii=False)  # {"name": "lili童鞋", "age": 22}
            return HttpResponse(l1) 
  ResponseJson方法:
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)
    1.2.1 使用JsonResponse方法存在汉字会乱码 可以通过json_dumps_params = {}给它传递实参来解决乱码问题
	from django.http import JsonResponse
	def mylist(request):
        info = {'name': 'lili童鞋', 'age': 23}
        # l1 = JsonResponse(info)      # {"name": "lili\u7ae5\u978b", "age": 23}
        l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False})     # {"name": "lili童鞋", "age": 23}
        return HttpResponse(l1)
    1.2.2 当序列化的不是字典类型的数据时报错:In order to allow non-dict objects to be serialized set the safe parameter to False.   
    需要确认传递的数据是否安全 防止产生错误 导致系统崩溃(如弹框)
    def mylist(request):
        info = [1, 3, 5]
        # l1 = JsonResponse(info)      # {"name": "lili\u7ae5\u978b", "age": 23}
        l1 = JsonResponse(info, json_dumps_params={'ensure_ascii': False}, safe=False)     # [1, 3, 5]
        return HttpResponse(l1)

form表单操作

1.携带文件数据具备条件:
  请求类型必须是method="post"
    		  multipart/form-data
  后端:request.FILES

FBV与CBV

1.FBV:基于函数的视图
  path('func/',views.view)
2.CBV:基于类的视图
  2.1 CBV源码分析:
     path('User/',views.User.as_view())
     User.as_view() 类中的方法as_view 我们写的类中没有 查找父类View中的as_view方法
     父类View中的as_view方法返回值view
     path('User/',views.view)
     执行view方法返回dispatch方法
     返回请求类型的小写
     执行请求类型的方法  

模板层

模板语法

传值

1.传值方式:
  指明道姓:适用于少量传值 
          return render(request, 'func.html', {'name': name})
  关键字locals():适用局部名称数据一次传入
          return render(request, 'func.html', locals())

过滤器

1.定义:类似于python内置函数

符号

1.使用数据:{{}}

2.使用方法:{%%}

标签

1.定义:类似于python中的流程控制

自定义功能

1.前提:
  在应用下创建templatetags文件夹
  创建py文件
  编写代码:from django.template import Library
		  register = Library()
2.类型:
  自定义过滤器:
  自定义标签
  自定义inclusion_tag

模板继承

1.原因:减少代码编写 一个html页面的样式需要在多个页面使用 采用模板继承的方式
2.更改部分数据:
	模板页面操作:用block进行包裹 之后在继承页面可以对该部分进行修改 一个页面至少应该有三处
              {% extends 'html文件名' %}
                {% block 名字 %}
                    模板内容
                {% endblock %}
    继承页面操作:
            css content js
            {% block css %}
            {% endblock %}
            {% block content %}
            {% endblock %}
            {% block js %}
            {% endblock %}
   注:子板中还可以使用母板的内容  {{ block.super }}  

模板导入

1.使用:将html页面的某个部分当做模块的形式导入使用

{% include 'func.html' %}

标签:web,框架,py,request,django,path,数据,路由
From: https://www.cnblogs.com/040714zq/p/16655187.html

相关文章

  • django框架-4
    目录网页伪静态视图层模板层网页伪静态将动态网页伪装成静态网页从而提升网页被搜索引擎收录的概率(掏点票票更快更能提高搜索频率)表现形式就是网址乍一看像一个具......
  • 2022java-web一条龙工具安装
    @目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk备忘~安装常见......
  • openEuler 22安装zabbix 4.0,提示无法安装zabbix-server-mysql和zabbix-web-mysql
    1.首先安装lamp环境作为zabbix的运行环境,也就是web展示界面环境dnfinstall-yhttpdmariadb-servermariadbphpphp-mysqlndphp-gdlibjpeg*php-ldapphp-odbcphp-p......
  • 2022java-web一条龙工具安装
    @目录java安装java-jdk安装java环境变量配置java-eclipse工具安装Java-idea工具安装MySQL安装navicat安装tomcat安装maven安装配置本地仓库配置镜像配置jdk备忘~安装常见......
  • django4/网页伪静态/视图层/模板层
    网页伪静态动态页动态网页,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。静态页即静态网页,是实际存在的,无需经过服务器......
  • Stream流中使用的Fork/Join框架
            Fork/Join简单案例:使用Fork/join计算1-10000的和当一个任务的计算数量大于3000的时候拆分任务,数量小于3000的时候就计算packagecom.tuling.st......
  • 【2022-09-02】Django框架(四)
    Django框架(四)Django框架之伪静态概念静态文件:数据是写死,永远不会修改伪静态:将一个动态页面伪装成静态页面#为什么要伪装?伪装的目的在于增大本网站的seo查询力......
  • 计算机组成结构——总体框架
    计算机主要包括CPU、存储器、输入输出设备三大部分。CPU其中CPU内包括控制器和算数逻辑单元。控制器控制器做为计算机的核心,其主要包括PC即程序计数器、IR指令寄存器,C......
  • web安全各类原理简单汇总(一)
    (1)jwt是什么?JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC7519),定义了一种简洁的,自包含的方法用于通信双方之间以Jso......
  • 为什么要在学习花哨的 JS 框架之前学习 Vanilla JavaScript?
    为什么要在学习花哨的JS框架之前学习VanillaJavaScript?这是DavidKopal的博客。在此博客中,您可以了解VanillaJS在您的职业生涯中的好处。他在博客中分享的文字......