django_python

Python 三大主流框架

"""
dj ango
特点:大而全自带的功能特别特另特别的多类似于航空母舰
不足之处:
	有时候过于笨重
	
flask
特点:小而精自 带的功能特别特别特别的少类似于游骑兵
第三方的模块特别特别特别的多,如果将flask第三方的模块加起来完全可以盖过django
井且也越来越像django
不足之处:
	比较依赖于第三方的开发者

tornado
特点:异步非阻塞支持高并发
	牛逼到甚至可以开发游戏服务器
不足之处:
	暂时你不会	
"""
A: sccket部分
B:路由与视图函数对应关系(路由匹配)
C:模版语法
 
django
        A  用的是别人的        wsgiref模块
        B 用的是自己的
        C 用的是自己的   (没有jinja2好用但是也很方便)
flask
        A 用的是别人的     werkzeug (内部还是wsgiref模块)
        B 自己写的
        C 用的别人的(jinja2)
tornado
A, B, C都是自己写的

注意事项

#   如何让你的计算机能够正常的启动dj ango项目
    1.  计算机的名称不能有中文
    2.  一个pycharm窗口只开一个项目
    3.  项目里面所有的文件也尽量不要出现中文
    4.   python解释器尽量使用3.4~3.6之间的版本
       (如果你的项目报错你点击最后一个报错信息去源码中把逗号删掉)
        
#  django版本问题
    1.X 2.X 3.X(直接忽略)
    1. x和2. x本身差距也不大我们讲解主要以1 . x为例会讲解2 , x区别
    公司之前用的1.B满满过渡到了1.11版本有一些项目用的2.0
    
#  django安装
    pip3 install django==1.11.11
    如果已经安装了其他版本  无需自己卸载  直接重新装  会自动卸载安装新的
   
    如果报错看看是不是  timeout   如果是那么只是网速波动    重新安装即可

    验证是安装成功的方式 1
        终端输入django- admin看看有没有反应

django基本操作

#命令行操作
    # 1,创建django项目
        """
        你可以先切换到对应的D盘然后再创建
        """
            django- admin startproject mysite
            
            mysite文件夹
                manage. py
                mysite文件夹
                    __init__ . py
                    settings. py
                    urls. py
                    wsgi. py
# 2.启动dj ango项目
        """
        一定要先切换到项目目录下
        cd /mysite
        """
    python3 manage .py runserver
    # http://127.0.0.1:8000/
    
# 3.创建应用
    """
    Next,start your first app by running python manage. py startapp
    [app_ 1abel].
    """
    python manage.py startapp app01
    应用名应该做到见名知意
        user
        order
        web
         ....
         ....
        但是我们教学统一就用app01/02/03/04
        
     有很多文件
    
# py
        # 1 new project 选择左侧第二个django即可
    
        # 2  启动
                1.还是用命令行启动
                2.点击绿色小箭头即可
                
        # 3  创建应用
                1. pycharm提供的终端直接输入完整命令
                2. pycharm
       				 tools
       				        run manage .py task提示(前期不要用给我背完整命令)
        # 4  修改端口号以及创建server
        edit confi....

应用

django是一款专[门用来开发app的web框架
           
django框架就类似于是- -所大学(空壳子)
ap就类似于大学里面各个学院(具体功能的app)
    比如开发淘宝
        订单相关
        用户相关
        投诉相关
        创建不同的app对应不同的功能
    选课系统
        学生功能
        老师功能
一个app就是一个独立的功能模块
           
"""
*********************创建的应用一定要去配置文件中注册***********************
"""   
# 注册的app(app就是功能模块)
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'app01.apps.App01Config',   #  全写
  ‘app01',     # 简写
]
           
#  创建出来的的应用第一步先去配置文件中注册其他的先不要给我干      
           
ps:你在用pycharm创建项目的时候pycharm可以帮你创建一个app且自动注册

主要文件介绍

-mysite项目文件夹
    -- mysite          文件夹
        --- settings.py    配置文件
        ---urls.py           路由与视图函数对应关系(路由层)
        -- -wsgi.py         wsgiref模块(不考虑)

- -manage.py     django的入口文件
-- db. sqlite3      django自带的sqlite3数据库(小型数据库功能不是很多还有bug)

-- app01               文件夹
    --- admin.py                   django后台管理
    --- apps.py                     注册使用
    --- migrations                 文件夹      数据库迁移记录
    --- models.py                  数据库相关的模型类(orm)
    ---tests .py                       测试文件
    ---views .py                     视图函数(视图层)

命令行与pycharm创建的区别

# 1命令行创建不会自动有terplatew文件夹 需要你自己手动创建而pycharn会自动帮你创建并且还会自动在配置文件中配置对应的路径

# pycharm创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
    },
]

# 命令行创建
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
    },
]

也就意味着你在用命令创建django项目的时候不单单需要创建templates文件夹还需要去配置文件中配置路径
'DIRS': [os .path. join(BASE DIR,‘ templates')l

django三板斧

HttpResponse
	返回字符串类型的数据
    
render
	返回html文件的
    
redirect
    重定向
        return redirect( 'https: //www .mzitu.com/' )
        return redirect( ' /home/')  # 自己写的函数

        def home (request):
                return HttpResponse( 'home ' )
     
    
return HttpResponse( '字符串')

return render ( reguest, ' login. html')

def ab_ render (request):
        #视图函数必须要接受一个形参request
        user_ dict = { 'username' :'jason''age':18}
        
        #第一种传值方式:更加的精确节省资源
        # return render ( request,'01 ab render.html' ,
        {'data':user_ dict, 'date' :123})
        
        # 第二种传值方式;当你要传的数据特别多的时候
        # lccals会将所在的名称空间中所有的名字全部传递给html页面
        return render (request,'01 ab_ render. html' ,locals())

静态文件配置

# 登陆功能
我们将htnl文件默认都放在templates文件夹下
我们将网站所使用的静态文件默认都放在statie文件夹下

静态文件
    前端已经写好了的能够直接调用使用的文件
        网站写好的js文件
        网站写好的esa文件
        网站用到的图片文件
        第三方前端框架
        ...............
	拿来就可以直接使用的
    
# django默认是不会自动帮你创理static文件夹需要你自己手动创建
    一般情况下我们在static文件突内还会做进一步的划分处理
        -static
        --js
        --css
        --img
        其他第三方文件
   
"""
在浏览器中输入ur1能够看到对应的资源
是因为后端提前开设了该资源的借口
如果访问不到资源说明后端没有开设该资源的借口
"""

http://127.0.0.1+8000/static/bootstrap- 3.3.7-dist/css/bootstrap .min.css

 #   静态文件配置
******************************************************************************
当你在写dj ango项目的时候可能会出现后端代码修改了但是前端页面没有变化的情况
        1.你在同一个端口开了好几个django项目
            一直在跑的其实是第一个django项目
        
        2.浏览器缓存的问题
            settings
                network
                    disable cache  勾选上
******************************************************************************

STATIC_ _URL = '/000/# 类似于访问静态文件的令牌
”””如果你想要访问静态文件你就必须以static开头""/static/bootstrap-3.3.7-dist/js/bootstrap.min.js
    
    /static/令牌
    
取列表里面从上往下依次查找
bootstrap-3.3.7-dist/js/bootstrap.min. js
        都没有才会报错
    
#静态文件配置
STATICFILES DIRS = [
        os.path. join(BASE DIR, 'static'),
        os.path. join(BASE DIR,'staticl' ),
        os. path. join(BASE_ DIR, 'static2' ),
]

# 静态文件动态解析
{% load static %}
    <link rel=" stylesheet" href="{% static " bootstrap-3.3.7-
    dist/css/bootstrap.min.css' %}">
    <script sre="(% static 'bootstrap-3.3. 7-dist/js/bootstrap.min.js
    %}"></script> 
    
    
# form表单默认是get请求数据
http://127.0.0.1 :8000/ login/ ?use rnane = jason&password= 123
        
form表单acticn参数
        1.不写默认朝当前所在的ur1提交数据
        2.全写指名道姓
        3.只写后缀/login/
        
        
#在前期我们使用dj ango提交post请求的时候需要取配置文件中注释掉一行代码

#  django中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
   # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

request对象方法初始

request . method   #返回请求方式并且是全大写的字符串形式<clasg str'>
request.POST         #获取用户post请求提交的普通数据不包含文件
    requeat . POST.get()      # 只获取列表最后一个元素
    request . POST. getlist() # 直接将列表取出
    
request.GET   #   获取用户提交的get请求数据
    request .GET.get() #只获取列表最后一个元素
    request .GET. getlistl() # 直接将列表取出
"""
get请求携带的数据是有大小限制的大概好像只有4KB左右
而post请求则没有限制
"""
def login (reguest):
#返回一个登陆界面
"""
  get请求和post请求应该有不同的处理机制
: param request: 请求相关的数据对象里面有很多简易的方法
: return:
"""

 print( type( request.method))    # 返回请求方式并且是全大写的字符串形式<class 'str'>

# if request .method == GET' : 
        printl'来了老弟')
	 return render( request, 'login.html' )
# elif request . method = 'POST' :
	 return attpResponse("收到了 宝贝")

if request. method == " POST' :
        return HttpResponse( “收到了宝贝")
return render (xequest,' login.htm1' ) 

pycharm链接数据库(MySQL)

三个位置查找数据库相关
    右侧上方database
    左下方database
    配置里面的plugins插件搜索安装
    
    再没有卸载pycharm重新装
    
pycharm可以充当很多款数据库软件的客户端

参考截图和视频操作即可
	需要提前创建好库

django链接数据库(MySQL)

# 项目指定的数据库   (sqlite3)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# django链接MySQL
   1.第一步配置文件中配置
            DATABASES  =  {
            ' default': {
                    ENGINE':        ‘django . db. backends .mysq1',
                    NAME':            ' day60',
                    USBR' :            'root ',
                    PASSWORD':    ' adnin123 " ,
                    HOST' :            " 127.0.0.1'.
                    PORT' :            3306,
                    CHARSET' :      'utf 8'
            }
}
        
"""
明明链接.上了数据库但是看不到表无法操作
这个时候你只需要将刚刚创建的链接删除重新链接一次即可
"""

  2,代码声明
        django默认用的是mysqldb模块链接MySQL
        但是该模块的兼容性不好需要手动改为用pymysq1链接
        
        你需要告诉django不要用默认的mysq1db还是用pymysql
        
        #  在项目名下的init或者任意的应用名下的init文件中书写以下代码都可以
        import pymysql
        pymysql. install_ as_ My5QLdb()

Django ORM

"""
orm不会帮你创建库只能创建到表的层面
需要你自己提前创建好库
"""
ORM,对象关系映射
作用:能够让一个不用sq1语句的小白也能够通过python面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高有时候sq1语句的效率偏低需要你自己写SQL语句
    
类			    表

对象			  记录

对象属性		记录某个字段对应的值

"""应用下面的models. py文件 """

# 1先去models.py中书写一个类
class User (models。Model ):
    # id int primary_ key auto_ incr ement.
    id = models . AutoField (primary_ key=True )
    # username varchar ( 32 )
    username = models . CharF ield(max_ length=32 )
    # password int
    password = models. IntegerField( )

*************************2. 数据库迁移命令*************************************
python3 manage .py makemigrations 将操作记录记录到小本本上(migrations文件夹)

python3 manage .py migrate  将操作真正的同步到数据库中

#只要你修改了models. py中跟数据库相关的代码就必须重新执行上述的两条命令
*******************************************************************************

class User (models .Model):
    # id int primary_ key auto_ inerenent
    id = models .AutoField(primary_ key=True,verbose_ name='主键')
    # usernene varchar(32 )
    username = models . CharF ield(max_ length=32 , verbose_ name='用户名')
    """
	CharField必须要指定max_ length参数 不指定会直接报错
       verbose_ name该参数是所有字段都有的就是用来对字段的解释
    """
    # password int
    password = models. IntegerField (verbose_ name- '密码')

    
class Author (models。Model ):
    #由于一张表中必须要有一个主键字段并且-般情况下都叫id字段
    #所以orm当你不定义主键字段的时候orm会自动帮你创建一个名为id主键字段
    #也就意味着后续我们在创建模型表的时候如果主键字段名没有额外的叫法那么主键字段    可以省略不写

    # username varchar(32 )
    username =models . CharF ield(max_ 1ength=32 )
    # password int
    password = models. IntegerField()

字段的增删改查

#字段的增加
    1.可以在终端内直接给出默认值
    2.该字段可以为空
     info = models . CharField (max_ length= 32 , verbose_ name='个人简
     介' ,null=True)
                                
    3.直接给字段设置默认值
     hobby = models .CharF ield(max_ length= 32,verbose_ name= '兴趣爱
     好',default= 'study')
                           
#字段的修改                               
 	直接修改代码然后执行数据库迁移的两条命令即可!
                                
#字段的删
       直接注释对应的字段然后执行数据库迁移的两条命令即可!
"""
在操作mode. ls . py的时候一定要细心
    千万不要注释- -些字段
    执行迁移命令之前最好先检查一下自己写的代码
"""
                              
#  个人建议:当你离开你的计算机之后一定要锁屏

数据的增删改查

#查
res = models . User .objects. fil ter (user name=username )

"""
返回值你先看成是列表套数据对象的格式
它也支持索引取值切片操作但是不支持负数索引
它也不推荐你使用索引的方式取值
user_ obf = models .User . objects.filter (username=username). first( )
"""
filter括号内可以携带多个参数参数与参数之间默认是and关系
你可以把filter联想成where记忆

#增
from app01 import models

res = models .User.objects .create ( user name =username , passwor d= pas sword )

#返回值就是当前被创建的对象本身

#第二种增加
# 先生成一个类对象
user_ obj = models .User ( username =usernane , pas sword-password )
# 对象调用save方法
user_ obj.save()    #保存数据

数据的查改删

#先讲数据库中的数据全部展示到前端然后给每一个数据两个按钮-个编辑一个删除


#查看

#编辑功能
	#点击编辑按钮朝后端发送编辑数据的请求
"""
    如何告诉后端用户想要编辑哪条数据?
        将编辑按钮所在的那一行数据的主键值发送给后端
        利用ur1问号后面携带参数的方式
        
      { % for user_ obj in uger_ queryset %}
                    <tr>
                            <td>{{ user_ obj.id }}</td>
                            <td>{{ user_ obj.username )}</td>
                            <td>{{ user_ obj. password }}</td>
                            <td>
                       		 <a href="  /edit_ user/?user_ id  = {{user_ obj.id }}” class = " btn btn-primary btn-xa ">编辑</a>
                    	      <a href="" class-"btn btn-danger btn-xs">删除</a>
                    
                    	 </td>

                    </tr>
               { % endfor % }

"""
#后端查询出用户想要编辑的数据对象展示至前端页面供用户查看和编辑
def edit. user(request):
    # 获取urL问号后面的参数
    edit_id = request .6ET.get( 'user_id' )
    # 查询当前用户想要编辑的数据对象
    edit_ obj = modelsy.User. abjects . filter(id=edit_ id) . first()
    
    if   request.method == "POST":
    username = request. POST .get('username ') 
    password = request. POST .get( ' password' )
    # 去数据库中修改对应的数据内容
    # 修改数据方式1
    # models ,user,objects。filter(id=edit_ id) .update (username susername, password=password) 
    
    """
        将filter查询出来的列表中所有的对象全部更新		批量更新操作
        只修改被修改的字段
    """
    
    #  修改数据方式2
    edit_ obj. username = us ernane
    edit_ obj.password= password
    edit_ obj. save()
"""
    上述方法当字段特别多的时候效事会非常的低
    从头到尾将数据的所有字段全部更新一边无论该字段是否被修改
"""

            #跳转到数据的展示页面
            return redirect( ' /userlist/' )

    
    #将数据对象展示到页面上
    return render (request, 'edit_ user .html' ,locals( ))


#册除功能

跟编辑功能逻辑类似
def delete user (request):
        #获取用户想要删除的数据id值
        delete_ id= request. GET.get( 'user_ id'l
        #直接去数据库中找到对应的数据删除即可
        models .User .objects. filter(id-delete_ id) .delete( )
                                     
    """
    批量删除
    """
    #  跳转到展示页面

     return redirect(' /userligt/')
                                     
# 真正的制除功能应该需要二次确认我们这里先不做后面会讲
# 删除数据内部其实并不是真正的册除我们会给数据添加一一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态

username 	password 	is_delete
jason		 123			0
egon		123			     1



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值