django笔记

 


**主流web框架总结:**
a socket
b 路由关系
c 模板字符串替换(模板语言)

django a用别人的 b自己写的 c自己写的
flask a用别人的 b自己写的 c用别人的(jinja2)
tornado a自己写的 b自己写的 c自己写的

另一个维度:
django
其他

创建Django

> #注意:别忘了前面加解释器

1 模块安装
2 django-admin startproject mysite
3 manage.py 管理我的django项目
4 启动django--python3

```bash
manage.py runserver 127.0.0.1:8002
-manage.py runserver 8002
-manage.py runserver
```
(2)pycharm启动:1 跟上面一样
2 点绿色的箭头
不是点右键运行
5 停止 ctrl+c

6 目录介绍
settings--django全局配置文件
urls---路由关系

创建app命令:
```bash
manage.py startapp app01
```
目录:
migrations:数据库迁移的文件
admin:后台管理相关
apps:app配置相关
models:模型,数据库相关,写一些类
test:测试相关
views:视图函数

settings:
DEBUG
INSTALLED_APPS---》放app的名字
MIDDLEWARE--》中间件
TEMPLATES---》指定我模板文件放的路径
DATABASES---》指定连接的数据库


静态文件配置:(名字一定不能错)
STATICFILES_DIRS=[
os.path.join(BASE_DIR, 'static'),
]


三件套:
# render 模板渲染
# HttpResponse 返回字符串
# redirect 重定向

 

orm:对象关系映射
python代码------》sql
前端:
$("#app")------>document.getElementById(‘app’)

优点:
1 sql掌握一般,也可开发程序
2 开发效率高
3 易用,学习曲线短

缺点:
1 sql大神,执行效率高,可能orm 执行效率低
2 有的sql写不出来

 

orm能干的事:
1 创建表,修改表,删除表
2 插入数据
3 修改数据
4 删除数据
不能干:不能创建数据库


类名-----》表

对象------》一条数据

属性-----》字段


使用mysql步骤:

1、创建数据库(orm不能创建数据库)
2、在settings里配置
3、在app的init.py文件里写上:
import pymysql
pymysql.install_as_MySQLdb()
4、在models里定义类,类必须继承 models.Model
5、写属性,对应着数据库的字段
6、执行 python manage.py makemigrations(相当于做一个记录)
7、执行 python manage.py migrate (会把记录执行到数据库)
注意:创建出来的表名是app的名字_类名

2.0 path
1 from django.urls import path
2 不支持正则,精准匹配
3 有5个转换器(int,str,slug,path,uuid)
4 自定义转换器:

```bash
4.1 写一个类:
class Test:
regex = '[0-9]{4}'
def to_python(self, value):
# 写一堆处理
value=value+'aaa'
return value
def to_url(self, value):
return '%04d' % value
4.2 from django.urls import register_converter
4.3 register_converter(Test,'ttt')
4.4 path('index/<ttt:year>', views.index,name='index'),
```

MVC和MTV

M T V

models template views

M V C(路由+views)
models 模板 控制器

视图层:request对象:
# form表单,不写method ,默认是get请求
# 1 什么情况下用get:请求数据,请求页面,
# 2 用post请求:向服务器提交数据
# request.GET 字典
# request.POST 字典
# 请求的类型
# print(request.method)
# 路径
# http://127.0.0.1:8000/index/ppp/dddd/?name=xxx
# 协议:ip地址和端口/路径?参数(数据)
# print(request.path)
# print(request.get_full_path())

 

JsonResponse(向前端页面发json格式字符串)

```bash
# dic={'name':'xxx','age':18}
# li=[1,2,3,4]
# # return HttpResponse(json.dumps(li))
# from django.http import JsonResponse
# return JsonResponse(li,safe=False)
```

CBV(class base view)和FBV(function base view)
cbv:

```bash
from django.views import View
class Test(View):
def dispatch(self, request, *args, **kwargs):
# 加点东西
print('111')
obj=super().dispatch(request, *args, **kwargs)
# 加点东西
print('2222')
return obj

def get(self,request):
obj= render(request,'index.html')
print(type(obj))
return obj
def post(self,request):
return HttpResponse('ok')
re_path(r'index/', views.Test.as_view()),
```

简单文件上传

```bash
1 <form action="" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="name">
密码:<input type="text" name="password">
文件:<input type="file" name="myfile">
<input type="submit">

</form>
#enctype="multipart/form-data" #提交数据必须指定的格式
#<input type="file" name="myfile"> #指定类型和名称

2 # ff是一个文件对象,django封装的
ff=request.FILES.get('myfile')
# 文件对象的名字
file_name=ff.name
from django.core.files.uploadedfile import InMemoryUploadedFile
print(type(ff))
with open(file_name,'wb') as f:
for line in ff.chunks():
f.write(line)
```

## 路由关系

基础知识,无名分组:url(r'^admin/', admin.site.urls),
# 第一个参数,可以写一个正则表达式
# 从上往下匹配,一旦匹配成功,就不往下走了
# 如果分几个个组,相应的视图函数,就应该接收几个
# 在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败
# 伪静态,方便搜索引擎收录
有名分组:

```bash
1 url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
2 def test(request,month,year):
print(year)
print(month)
return HttpResponse('ok')
#名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
3 有名分组和无名分组不要混用
4 有名分组可以用**kwargs接收,无名分组可以用*args接收
5 分组捕获的参数,都是str类型
6 可以设置默认值
```

路由分发:

```bash
1 先导入from django.conf.urls import include
2 url(r'^app01/', include('app01.urls')),有两种方式:。。。。
3 在相应的app里创建urls py文件,建议,不要改名字
4 urlpatterns 不能变名字 ,后面的写法就一样了 url(r'^test',views.test3 ),
5 重复上面步骤,分发多个
```

2.几和1.几的区别
1 2.几的re_path 就是我原来的url
2 2.几多了一个path,不支持正则

反向解析

```bash
1 路由中,命一个名,url(r'^index/', views.index,name='n1'),
2 在视图函数里:
from django.shortcuts import reverse
#这样就能拿到我反向解析出来的url
url=reverse('n1')
3 在模板里用:
{% url 'n1'%}
4 带位置参数反向解析 url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,))

模板:{% url 'n1' 2012 12 %}
5 带关键字参数反向解析 url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,) ---可以
url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以

模板:
{% url 'n1' 2012 12 %}----可以
{% url 'n1' month=12 year=2012 %}----可以
注意:按位置传,顺序是固定的
```

作用:修改路由中url的时候,其它地方不需要改动

 

名称空间:(知道它,但是建议不同app的url里name不能重名,app的名字_name)

```bash
1 url(r'^app01/', include('app01.urls',namespace='app01')),
urlpatterns = [
url(r'^test',views.test3 ,name='test'),
]
url(r'^app02/', include('app02.urls',namespace='app02')),
urlpatterns = [
url(r'^test02',views.test3 ,name='test'),
]
2 在视图函数里:
url=reverse('app02:test')
print(url)
3 在模板里:
<a href="{% url 'app02:test' %}">点我跳到首页</a>
```

 

posted @   爱喝王仔  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示