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都是自己写的
注意事项
1. 计算机的名称不能有中文
2. 一个pycharm窗口只开一个项目
3. 项目里面所有的文件也尽量不要出现中文
4. python解释器尽量使用3.4 ~ 3.6 之间的版本
( 如果你的项目报错你点击最后一个报错信息去源码中把逗号删掉)
1 . X 2 . X 3 . X( 直接忽略)
1. x和2. x本身差距也不大我们讲解主要以1 . x为例会讲解2 , x区别
公司之前用的1 . B满满过渡到了1.11 版本有一些项目用的2.0
pip3 install django== 1.11 .11
如果已经安装了其他版本 无需自己卸载 直接重新装 会自动卸载安装新的
如果报错看看是不是 timeout 如果是那么只是网速波动 重新安装即可
验证是安装成功的方式 1
终端输入django- admin看看有没有反应
django基本操作
"""
你可以先切换到对应的D盘然后再创建
"""
django- admin startproject mysite
mysite文件夹
manage. py
mysite文件夹
__init__ . py
settings. py
urls. py
wsgi. py
"""
一定要先切换到项目目录下
cd /mysite
"""
python3 manage . py runserver
"""
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
有很多文件
1. 还是用命令行启动
2. 点击绿色小箭头即可
1. pycharm提供的终端直接输入完整命令
2. pycharm
tools
run manage . py task提示( 前期不要用给我背完整命令)
edit confi. . . .
应用
django是一款专[ 门用来开发app的web框架
django框架就类似于是- - 所大学( 空壳子)
ap就类似于大学里面各个学院( 具体功能的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创建的区别
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) :
user_ dict = { 'username' : 'jason' ,'age' : 18 }
{ 'data' : user_ dict , 'date' : 123 } )
return render ( request, '01 ab_ render. html' , locals ( ) )
静态文件配置
我们将htnl文件默认都放在templates文件夹下
我们将网站所使用的静态文件默认都放在statie文件夹下
静态文件
前端已经写好了的能够直接调用使用的文件
网站写好的js文件
网站写好的esa文件
网站用到的图片文件
第三方前端框架
. . . . . . . . . . . . . . .
拿来就可以直接使用的
一般情况下我们在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>
http: // 127.0 .0 .1 : 8000 / login/ ?use rnane = jason& password= 123
form表单acticn参数
1. 不写默认朝当前所在的ur1提交数据
2. 全写指名道姓
3. 只写后缀/ login/
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware' ,
'django.contrib.sessions.middleware.SessionMiddleware' ,
'django.middleware.common.CommonMiddleware' ,
'django.contrib.auth.middleware.AuthenticationMiddleware' ,
'django.contrib.messages.middleware.MessageMiddleware' ,
'django.middleware.clickjacking.XFrameOptionsMiddleware' ,
]
request对象方法初始
request . method
request. POST
requeat . POST. get( )
request . POST. getlist( )
request. GET
request . GET. get( )
request . GET. getlistl( )
"""
get请求携带的数据是有大小限制的大概好像只有4KB左右
而post请求则没有限制
"""
def login ( reguest) :
"""
get请求和post请求应该有不同的处理机制
: param request: 请求相关的数据对象里面有很多简易的方法
: return:
"""
print ( type ( request. method) )
printl'来了老弟' )
return render( request, 'login.html' )
return attpResponse( "收到了 宝贝" )
if request. method == " POST' :
return HttpResponse( “收到了宝贝")
return render ( xequest, ' login.htm1' )
pycharm链接数据库(MySQL)
三个位置查找数据库相关
右侧上方database
左下方database
配置里面的plugins插件搜索安装
再没有卸载pycharm重新装
pycharm可以充当很多款数据库软件的客户端
参考截图和视频操作即可
需要提前创建好库
django链接数据库(MySQL)
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.sqlite3' ,
'NAME' : os. path. join( BASE_DIR, 'db.sqlite3' ) ,
}
}
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
import pymysql
pymysql. install_ as_ My5QLdb( )
Django ORM
"""
orm不会帮你创建库只能创建到表的层面
需要你自己提前创建好库
"""
ORM,对象关系映射
作用: 能够让一个不用sq1语句的小白也能够通过python面向对象的代码简单快捷的操作数据库
不足之处: 封装程度太高有时候sq1语句的效率偏低需要你自己写SQL语句
类 表
对象 记录
对象属性 记录某个字段对应的值
"""应用下面的models. py文件 """
class User ( models。Model ) :
id = models . AutoField ( primary_ key= True )
username = models . CharF ield( max_ length= 32 )
password = models. IntegerField( )
** ** ** ** ** ** ** ** ** ** ** ** * 2. 数据库迁移命令** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
python3 manage . py makemigrations 将操作记录记录到小本本上( migrations文件夹)
python3 manage . py migrate 将操作真正的同步到数据库中
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
class User ( models . Model) :
id = models . AutoField( primary_ key= True , verbose_ name= '主键' )
username = models . CharF ield( max_ length= 32 , verbose_ name= '用户名' )
"""
CharField必须要指定max_ length参数 不指定会直接报错
verbose_ name该参数是所有字段都有的就是用来对字段的解释
"""
password = models. IntegerField ( verbose_ name- '密码' )
class Author ( models。Model ) :
username = models . CharF ield( max_ 1ength= 32 )
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 )
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) :
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' )
"""
将filter查询出来的列表中所有的对象全部更新 批量更新操作
只修改被修改的字段
"""
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) :
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