Python Web 框架 django 深入解析


# Python主流web框架

1.django框架      同步框架
    大而全、自身自带的组件非常的多
    类似于航空母舰
    但是在写一些小的项目或者是流动性较强的项目的时候
    使用django框架可能会让你感觉到笨重

2.flask框架       同步框架
    小而精、自身自带的组件非常的少
    类似于游骑兵
    虽然flask本身没有什么功能但是支持flask框架的第三方模块特别的多,如果将flask第三方模块加起来完全是可以超过django的
    有时候框架的更新迭代功能上反而会受限于第三方模块

3.tornado框架     异步框架
    异步非阻塞
        异步
            提交完任务之后不原地等待任务的结果直接指向下一行
        非阻塞
            程序要么处于运行态、要么处于就绪态(最大化的占有CPU)
    速度非常的快、快到甚至可以开发游戏服务器

# 上述三个web框架不要同时学习,一定要先学完一个之后再学其他的,不然的话极有可能出现混淆

web框架作用范围

浏览器发送请求>>>nginx反向代理>>>uwsgi(web服务网关接口)>>>后端服务器(web框架)
    web框架里面包含了所有处理业务逻辑的代码

使用框架的好处在于很多py文件和文件夹都不需要你自己创建
你只需要往框架提供好的文件里面填写代码即可(搬砖)

django框架

1.版本
    1.X公司里面大部分也用的是1.X版本
    2.X也有使用的情况,但是2.X和1.X差距不大
    3.X新出来的版本 具有异步的功能(该功能还在研发当中  不用)

2.下载
    pip3 install django==1.11.11

3.如何验证是否下载完毕
    打开终端输入django-admin如果出现了一堆代码说明成功了

django项目

1.命令行操作django
    1.创建django项目
        django-admin startproject 项目名
    2.启动django项目
        切换到项目目录下
        python3 manage.py runserver
        (django默认端口号8000)
    3.创建app
        python3 manage.py startapp app的名字
        (老男孩传统app01、02、03、04...)

    # 注意创建的app一定要去django配置文件中注册,否则可能无效
    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 你创建的app一定要在这里面注册一下
    'app01'  # 简写
    # 'app01.apps.App01Config'  # 全称
]
2.pycharm操作django

django中的app的概念

django框架本身只是一个空壳子 该空壳子只是给你提供了一个能够正常运行的环境,如果你想要写业务逻辑代码就需要创建app(应用)
一个django项目可以有多个应用
    django项目看成是大学
    应用看成是大学里面的一个个学院

比如你想用django开发淘宝
    淘宝有很多功能区域
        订单模块
            订单app
        客户模块
            客户app
        购物模块
            购物app
        售后模块
            售后app
    # 不同的功能模块就创建不同的app这样的话能够实现代码的解耦合、更加有利于分组开发    

注意事项

1.你的计算机名称不能有中文
2.python解释器如果是3.7可能会报错
    点击报错的地点将逗号删掉即可
    或者用python3.6
3.项目名文件名也尽量不要用中文
4.一个pycharm窗口就是一个django项目,不要做文件夹的嵌套

django主要文件介绍

项目名
    项目同名文件夹
        settings.py  配置文件
        urls.py      路由
    templates文件夹
        里面放的是一对html文件
    应用文件夹
        migrations文件夹   数据库迁移记录
        admin.py          django后台管理
        models.py         模型层(跟数据库打交道)
        views.py          视图层(业务逻辑代码)
    manage.py           django的启动(入口)文件

    # 运行一次django之后 会出现一个db.sqlite3文件
    '''
    django默认自带一个小型的sqlite3数据库
    '''

django请求生命周期流程图

urls.py
views.py
templates
models.py

django小白必会三板斧

请求流程
    浏览器输入地址
    urls.py匹配对应的地址
    去views.py执行对应的函数
    函数的返回值就是给浏览器的结果

1.HttpResponse
    返回字符串
2.render
    返回html页面
3.redirect
    重定向


# views.py
from django.shortcuts import render,HttpResponse,redirect
def f1(request):
    return HttpResponse('你好啊')
def f2(request):
    return render(request,'f1.html')
def f3(request):
    return redirect('/index/')

# urls.py
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.f1),
    url(r'^func/', views.f2),
    url(r'^home/', views.f3),
]

登录功能

1.应该在后台开设一个访问登录页面的url

静态文件

网站需要使用的已经写好了的文件
    比如页面的
        css文件
        js文件
        image文件
        第三方插件文件
在django中静态文件需要你自己创建一个专门存放静态文件的文件夹


浏览器输入url之所以能够拿到对应的页面和数据
是因为后端提前开设该资源的接口
(拿不到资源说明没有开设对应的接口)

静态文件配置

STATIC_URL = '/static/'
# 静态文件配置 开设资源
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),  # 将static文件里面的资源全部暴露给外界
    os.path.join(BASE_DIR,'static1'),  # 将static文件里面的资源全部暴露给外界
    os.path.join(BASE_DIR,'static2'),  # 将static文件里面的资源全部暴露给外界
]
"""
STATIC_URL = '/static/'是令牌 要想访问静态文件资源 必须以/static/开头
STATICFILES_DIRS后面的列表才是真正的文件夹的路径
    查找的时候会按照从上往下的顺序查找文件
"""


静态文件动态查找:动态解析接口前缀(令牌)
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">

请求方式

get请求
    朝别人要数据 也可以携带一些参数
    eg:获取招聘信息但是可以加限制(本科、D轮及以上)
post请求
    朝别人提交数据 
    eg:登录、注册

form表单

action
    控制提交的路径的
        1.不写的话
            默认就是朝当前页面所在的url提交数据
        2.全称
            https://www.baidu.com
        3.后缀
            /index/
            朝当前服务器路径index发请求
method
        1.method默认是get请求
            get请求携带参数的特点
                url?username=jason&password=123
        2.method还可以修改为post
            post请求携带参数
                放在了请求体里面

HTTP协议

四大特性
    1.基于请求响应
    2.基于TCP/IP作用于应用层之上的协议
    3.无状态
    4.无/短连接

请求格式
    请求首行
    请求头

    请求体(pots请求数据放在请求体里面 get请求没有请求体)

响应格式
    响应首行
    响应头

    响应体(浏览器能够拿到的数据)

响应状态码
    1XX
    2XX
    3XX
    4XX
    5XX

csrf校验

前期提交post请求需要先去配置文件中注释掉一个中间件即可
MIDDLEWARE = [
    # 'django.middleware.csrf.CsrfViewMiddleware',
]

request对象方法

request.method  获取请求方法
request.POST    获取post请求数据
    get
    getlist
request.GET     获取get请求数据
    get
    getlist

pycharm连接数据库

Django连接数据库

django默认使用的是自带的sqlte3数据库(比较小 功能也不全)

django连接MySQL
1.先去配置文件中修改配置
    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lnx_day03_2',
        'USER':'root',
        'PASSWORD':123,
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8'
    }
}
# 第一步配置完成后无法正常启动django

2.在项目文件夹下或者应用文件夹下的__init__.py文件中
import pymysql
pymysql.install_as_MySQLdb()

django orm

ORM:对象关系映射

表                           类                   
记录                          对象
记录某个字段的数据           对象的属性
# django orm只能帮你创建表,库是需要你自己提前指定好的
"""
ORM的好处在于将所有MySQL的操作封装成了面向对象的操作
让一个不会sql语句的小白也能够通过python面向对象的知识点简单快捷的操作数据库
"""
# 需要你去应用下面的models.py中书写代码
from django.db import models

# Create your models here.
class Userinfo(models.Model):
    # id int primary key auto_increment
    id = models.AutoField(primary_key=True)
    # name varchar(32)
    name = models.CharField(max_length=32)  # CharField必须要有max_length参数
    # password int
    password = models.IntegerField()


***********************************************************
数据库迁移命令
1.将数据库的操作记录到小本本上
    migrations文件夹下面
    python3 manage.py makemigrations
    # 该命令不会直接操作数据库
2.将操作真正同步到数据库中
    python3 manage.py migrate
***********************************************************
# 只要你在models.py中动了跟数据库相关的代码,你就必须重新执行上面的两条命令

orm简单操作

# 获取user表里面所有的数据
data = models.User.objects.all()
# print(data)
# 具有条件的查询
user_obj = models.User.objects.filter(name=username).first()
# 编辑数据
models.User.objects.filter(name='egon').update(name='egonDSB')
# 删除数据
models.User.objects.filter(id=3).delete()

# 针对字段的只需要添加或者注释然后输入数据库迁移命令即可
desc = models.CharField(max_length=32,null=True)  # 该字段可以为空
country = models.CharField(max_length=32,default='China')

路由层(urls.py)

1.X版本
url()方法第一个参数其实是一个正则表达式
2.X版本
path()方法第一个参数不再支持正则,而是写什么就匹配什么

urlpatterns = [
    url(r'^test/',views.test),
    url(r'^testadd/',views.testadd),
]

有名分组与无名分组

# 无名分组
url(r'^index/(\d+)/',views.index)
'''
加了括号的正则表达式会将它匹配到的内容当做
位置参数传递给后面的视图函数
index(request,123)
'''

# 有名分组
url(r'^index/(?P<year>\d+)/', views.index)
'''
加了括号的正则表达式会将它匹配到的内容当做
关键字参数传递给后面的视图函数
index(request,year=123)
'''

'''
无名分组和有名分组两者不能混合使用
但是单独的某一个都可以使用多次
url(r'^index/(\d+)/(?P<year>\d+)',views.index)  不可以


url(r'^index/(\d+)/(\d+)/(\d+)/',views.index)  可以
url(r'^index/(?P<year>\d+)/(?P<year>\d+)/(?P<year>\d+)/', views.index)     可以
'''

反向解析

# 反向解析
url(r'^home666/',views.home,name='hm')

from django.shortcuts import render,HttpResponse,redirect,reverse
def index(request,*args,**kwargs):
    # return  HttpResponse("index")
    # return redirect('/home/')
    url = reverse('hm')  # 最正规的
    print(url)
    return redirect('hm')  # 也支持直接解析并跳转

针对无名有名的反向解析
在解析的时候针对正则表达式符号需要你自己传对应的参数
url(r'^index/(\d+)/$', views.index,name='index'),
url = reverse('index',args=(222,))  # 最正规的
print(url)

视图层(views.py)

form表单上传文件

1.method必须是post
2.enctype必须是"multipart/form-data"
    默认是urlencoded

后端获取用户上传的文件用
    request.FILES



def myfile(request):
    if request.method == 'POST':
        # 获取用户提交的数据 包含文件
        # print(request.POST)  # 只能拿到非文件的普通字符串数据
        # print(request.FILES)
        file_obj = request.FILES.get('myfile')  # 文件对象
        with open(file_obj.name,'wb') as f:
            for line in file_obj:
                f.write(line)
    return render(request,'myfile.html')

json格式数据

import json
from django.http import JsonResponse
def myjson(request):
    d = {'username':'jason','password':123}
    # res = json.dumps(d)
    # return HttpResponse(res)
    return JsonResponse(d)

CBV与FBV

FBV
    基于函数的视图
CBV
    基于类的视图   
from django.views import View
class MyClass(View):
    def get(self,request):
        return HttpResponse("get方法")
    def post(self,request):
        return HttpResponse('post方法')
# CBV
url(r'^myclass/',views.MyClass.as_view())
'''
能够根据请求方法的不同自动匹配到类里面的方法并自动执行
'''

模板层(templates)

模板语法

支持后端将python基本数据类型传递给html页面
同时还支持传函数名、类名、对象
但是针对函数和类会自动加括号调用,但是不支持传额外的参数
# 第一种给模板传值的方式 指名道姓的传
# return render(request,'mytem.html',{'i':i})
# 第二种简单粗暴 直接一锅传
return render(request, 'mytem.html',locals())
# html页面上 通过两个大括号引用即可
<p>{{ obj }}</p>

标签及过滤器

# 过滤器(内置函数)
<p>{{ i|add:10 }}</p>
<p>{{ s|length }}</p>
<p>{{ s|slice:'0:8' }}</p>
<p>{{ ctime|date:'Y-m-d' }}</p>
<p>{{ file_size|filesizeformat }}</p>
<p>{{ res|safe }}</p>
<p>{{ res1|safe }}</p>

# 标签
if判断和for循环
{% if s %}
    <p>s不是空的</p>
    {% else %}
    <p>s是空的</p>
{% endif %}

{% for foo in s %}
    {% if forloop.first %}
        <p>这是我的第一次for循环</p>
    {% elif  forloop.last %}
        <p>这是最后一次了啊 有点累</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}

"""
变量相关用:{{}}
逻辑相关用:{%%}
"""

模板的继承与导入

首先需要在母版中先用block划定将来可能需要被修改的区域
{% block content %}
{% endblock %}

子版需要先继承母版
{% extends 'home.html' %}
之后再利用block对之前划定的区域做内容的修改
{% block content %}
<h1 class="text-center">注册</h1>
{% endblock %}


'''
扩展
一个母版上至少应该有三个区域
    css
    content
    js
'''
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}



# 将一个html文件当做模块的形式导入
导入的基本都不是完整的html页面 而是页面的某个部分

模型层(models.py)

  • orm概念
  • 数据库迁移命令

表查询

# 直接书写一个测试脚本 专门测试django某个py文件
在新建的py文件或者应用自带的tests文件内书写即可
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myddd.settings")
    import django
    django.setup()

表关系创建

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)
    create_time = models.DateTimeField(auto_now_add=True)
    # 一对多外键
    publish = models.ForeignKey(to='Publish')  # 自动加_id后缀
    # 多对多外键
    authors = models.ManyToManyField(to='Author')  # 虚拟字段 不会在表中出现
    # 只是用来告诉orm需要创建书和作者的第三张关系表

class Publish(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    Author_detail = models.OneToOneField(to='AuthorDetail')

class AuthorDetail(models.Model):
    phone = models.BigIntegerField()
    addr = models.CharField(max_length=32)
'''
判断表关系用换位思考
书和出版社是一对多的表关系
    书是多的一方
    外键字段建在多的一方

书和作者是多对多的表关系
    多对多外键字段建在任何一张表都可以
    但是推荐建在查询频率较高的表中

作者和作者详情是一对一表关系
    一对一外键字段建在任何一张表都可以
    但是推荐你建在查询频率较高的表中
'''

# 一对多和一对一字段都会自动帮你加_id后缀
# 多对多字段会自动帮你创建第三张表

跨表查询

按照我们上面创建好的表参考博客即可
https://www.cnblogs.com/Dominic-Ji/p/10881214.html

拷贝了视频的可以直接查看相应的多表操作的内容
day55视频
Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » Python Web 框架 django 深入解析

提供最优质的资源集合

立即查看 了解详情