django初步--+urls解析
1.静态文件配置:
你在浏览器中输入网址能够有响应的资源返回给你
是因为后端已经提前给你开设该资源的接口,也就意味着你所能
访问到的资源 都是人家事先定义好的。
2.django如何给用户开设资源接口呢?
在urls.py中 开设路由与视图函数对应关系。
3.什么是静态文件
网站所使用的已经提前写好的css文件 js 图片 第三方的类库一般情况下 我们都默认将网站所用到的静态文件统一放在一个叫static文件夹下该文件夹内部 还可以根据文件类型的不同划分成不同的子文件、css文件、js文件、font文件、img文件、第三方模块专门的文件。django不会自动帮你建static文件 需要你自己手动创建。
4.如何暴露静态文件资源给用户访问
django为了你暴露方便 不需要你自己手动去urls.py中配置
你只需要在settings.py配置即可
STATIC_URL = '/static/' # 访问静态文件资源接口前缀
如果你想访问静态文件资源 你必有以上面的名字开头
你才有访问静态文件资源的权限
一旦你是以接口前缀开头 我会拿着接口前缀后面的文件路径
去下面的列表中从上往下去每一个文件夹 找寻是否存在该文件 如果是直接返回
# 自己手动配置路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'), # 静态文件 存放在的文件路径
os.path.join(BASE_DIR,'static1'), # 静态文件 存放在的文件路径
os.path.join(BASE_DIR,'static2'), # 静态文件 存放在的文件路径
]
5.接口前缀动态绑定
html页面上的接口前缀跟你的配置文件中接口前缀动态绑定
在html页面上 固定写句式
{% load static %}
<script src='{% static 'Bootstrap/css/min.css' %}'></script>
6.request对象
该对象内部包含了所有请求相关的数据
request.method 获取前端发送的请求方式,GET、POST全大写的字符串类型
携带数据的方式;GET请求携带数据的方式url?username=jason&password=123,
只要你的ulr后面符号get请求携带参数的特点 那么无论你发什么请求 你都可以通过request.GET获取数据,
request.GET 获取符合GET请求携带数据的方式;你可以把它看成一个大字典
request.GET.get() 默认只拿value列表中最后一个元素
request.GET.getlist() 拿value整个列表
request.POST 获取post请求携带过来的数据
你可以把它看成一个大字典
request.POST.get() 默认只拿value列表中最后一个元素
request.POST.getlist() 拿value整个列表
处理文件时:
7.pycharm链接数据库
左下方或者右侧边缘都有连接入口
你只需要注意在第一次连接数据库的时候 需要下载一个数据库的驱动
django链接MySQL
django默认自带一个小型的sqlite(对日期格式的数据 不太兼容)
一定要注意是两步
1.在settings文件中配置
DATABASES = {
"NAME":...
"HOST":...
"PORT":...
"USER":...
"PASSWORD":...
"CHARSET":'utf8'
}
2.需要在项目名下面的__init__.py或者app下面的__init__.py文件中配置一下
告诉django不要使用默认的mysqldb模块连接数据库 而是使用pymysql
import pymysql
pymysql.install_as_MySQLdb()
8.django orm简介
ORM:对象关系映射
注意:django的orm不会自动帮你创建数据库 需要你手动自己创建数据库
orm只能帮你自动创建表
个人建议:针对不同的django项目 使用不同的库 不要多个项目公用一个数据库
你要去app下面的models.py中书写模型类
表字段的书写
class User(models.Model):
django orm当你没有指定主键的时候 orm会自动帮你新建一个字段名为id的主键字段
但是如果你的主键字段不想叫id 那么你只能手动设置 一旦orm识别到你手动设置了主键 它就不再自动创建
id = models.AUTOField(primary_key = True)
username = models.CharField(max_length=32) CharField字段一定要指定max_length参数
password = models.IntegerField()
数据库迁移命令
将在models里面的操作同步到数据库中
python3 manage.py makemigrations 将数据库操作记录到小本本上 migrations文件夹内 日志功能 该命令不会直接影响数据库
python3 manage.py migrate 将记录真正的同步到数据库中
只要你动了跟数据库相关的models中的代码 你就必须执行上面的命令
一个都不能少 顺序也不能跌倒
字段的增删改查
增字段的时候
1.给新增的字段设置默认值
2.给新增的字段设置为允许为空
数据的增删改查
查
models.User.objects.all() 查询所有
models.User.objects.filter(**kwargs) 条件之间是and的关系
filter的结果你可以看成是一个列表 支持索引取值和切片操作 但是不支持负数,.first()
增
user_obj = models.User.objects.create(**kwargs)
该方法有一个返回值 就是当前被创建的对象本身
改
models.User.obejcts.filter(id=1).update(**kwargs)
批量更新
删
models.User.obejcts.filter(id=1).delete()
批量删除
9.orm表关系如何建立
多对多;一对多;一对一
换位思考 先站在一张表上面分析 然后再站在另一张分析
一对多 外键字段建在 多的那一方
多对多 多对多的外键关系需要建立第三章来专门处理
图书表;出版社表;作者表
from django.db import models
先不要考虑外键关系 先创基表
class Book(models.Model):
title = models.CharField(max_length=32)
小数总共八位 小数占两位
price = models.DecimalField(max_digits=8,decimal_places=2)
书跟出版社是一对多 并且书是多的一方 所以外键字段健在书表中
publish_id = models.ForeignKey(to='Publish') to用来指代跟哪张表有关系 默认关联的就是表的主键字段
一对多外键字段 创建的时候 同步到数据中 表字段会自动加_id后缀
如果你自己加了_id 我orm头铁 再在后面加一个_id
所以你在写一对多外键字段的时候 不要自作聪明的加_id
书跟作者是多对多的关系 外键字段建在任意一方都可以 但是建议你建在查询频率较高的那一方
author = models.ManyToManyField(to='Author') # django orm会自动帮你创建书籍 和作者的第三张关系表
author这个字段是一个虚拟字段 不能在表中展示出来 仅仅只是起到一个告诉orm 建第三章表的关系的作用
class Publish(models.Model):
title = 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='Author_detail') fk + unique
一对一外键字段 创建的时候 同步到数据中 表字段会自动加_id后缀
如果你自己加了_id 我orm头铁 再在后面加一个_id
所以你在写一对一外键字段的时候 不要自作聪明的加_id
class Author_detail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=32)
10.urls.py 路由层
url第一个参数是一个正则表达式 只要该正则表达式能够匹配到内容
就会立刻执行后面的视图函数 而不再往下继续匹配了
路由匹配
取消django自动让浏览器加斜杠的功能
APPEND_SLASH = False 该参数默认是True
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),
url第一个参数是一个正则表达式url(r'^test/$', views.test),
一旦正则表达式能够匹配到内容 会立刻结束匹配关系 直接执行后面对应的函数
url(r'^testadd/$', views.testadd),
]
django匹配路由的规律
不加斜杠 先匹配一次试试 如果匹配不上 会让浏览器重定向 加一个斜杠再来一次 如果还匹配不上 才会报错
路由匹配值匹配url部分
不匹配‘?’后面的get携带的参数
无名分组:将分组内正则表达式匹配到的内容当做位置参数传递给视图函数
url(r'^test/([0-9]{4})/', views.test)
报错“test() takes 1 positional argument but 2 were given”
当你的路由中有分组的正则表达式 那么在匹配到内容
执行视图函数的时候 会将分组内正则表达式匹配到的内容当做位置参数传递给视图函数
test(request,分组内正则表达式匹配到的内容)
有名分组:会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数
url(r'^testadd/(?P<year>\d+)/', views.testadd),
报错“testadd() got an unexpected keyword argument 'year'”
当你的路由中有分组并且给分组起了别名 那么在匹配内容的时候
会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数
testadd(request,year=分组内的正则表达式匹配到的内容)
利用有名个无名分组 我们就可以在调用视图函数之前给函数传递额外的参数
疑问:无名和有名能否混合使用???
url(r'^index/(\d+)/(?P<year>\d+)/', views.index),
**********不能混合使用*************!!!
但是同一种分组的情况下 可以使用多次
无名可以有多个
有名可以有多个
但是就是不能混合使用
url(r'^index/(\d+)/(\d+)/', views.index),
url(r'^index/(?P<args>\d+)/(?P<year>\d+)/', views.index),
反向解析
根据一个别名 动态解析出一个结果 该结果可以直接访问对应的url
第一种情况
路由中没有正则表达式 直接是写死的
url(r'^home/', views.home,name='xxx'), # 给路由与视图函数对应关系起别名
前端反向解析
{% url 'xxx' %}
后端反向解析
from django.shortcuts import render,HttpResponse,redirect,reverse
url = reverse('xxx')
第二种情况
无名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么
url(r'^home/(\d+)/', views.home,name='xxx'), # 给路由与视图函数对应关系起别名
前端反向解析
<p><a href="{% url 'xxx' 12 %}">111</a></p>
<p><a href="{% url 'xxx' 1324 %}">111</a></p>
<p><a href="{% url 'xxx' 14324 %}">111</a></p>
<p><a href="{% url 'xxx' 1234 %}">111</a></p>
后端反向解析
url = reverse('xxx',args=(1,))
url1 = reverse('xxx',args=(3213,))
url2 = reverse('xxx',args=(2132131,))
手动传入的参数 只需要满足能够被正则表达式匹配到即可
第三种情况
有名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么
有名分组的反向解析可以跟无名分组一样
但是最最正规的写法
url(r'^home/(?P<year>\d+)/', views.home,name='xxx'), # 给路由与视图函数对应关系起别名
前端
可以直接用无名分组的情况
<p><a href="{% url 'xxx' 12 %}">111</a></p>
你也可以规范写法
<p><a href="{% url 'xxx' year=1232 %}">111</a></p> # 了解即可
后端
可以直接用无名分组的情况
url = reverse('xxx',args=(1,))
# 你也可以规范写法
url = reverse('xxx',kwargs={'year':213123}) # 了解即可
以编辑功能为例
url(r'^edit_user/(\d+)/',views.edit_user,name='edit')
def edit_user(request,edit_id):
edit_id就是用户想要编辑数据主键值
pass
{% for user_obj in user_list %}
<a href='/edit_user/{{user_obj.id}}/'>编辑</a>
<a href='{% url 'edit' user_obj.id %}'>编辑</a>
{% endfor %}
********路由分发***********
前提
在django中所有的app都可以有自己独立的urls.py templates static
正是由于上面的特点 你用django开发项目就能够完全做到多人分组开发 互相不干扰
每个人只开发自己的app
小组长只需要将所有人开发的app整合到一个空的django项目里面
然后在settings配置文件注册 再利用路由分发将多个app整合到一起即可完成大项目的拼接
路由分发解决的就是项目的总路由匹配关系过多的情况
使用路由分发 会将总路由不再做匹配的活 而仅仅是做任务分发(请求来了之后 总路由不做对应关系
只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理
)
from app01 import urls as app01_urls
from app02 import urls as app02_urls
urlpatterns = [
url(r'^admin/', admin.site.urls), # url第一个参数是一个正则表达式
********路由分发********
url(r'^app01/',include(app01_urls)), # 路由分发需要注意的实现 就是总路由里面不能以$结尾
url(r'^app02/',include(app02_urls)),
]
子路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url('^reg/',views.reg)
]
from django.conf.urls import url
from app02 import views
urlpatterns = [
url('^reg/',views.reg)
]
最省事的写法(******)
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))
名称空间
当多个app中出现了起别名冲突的情况 你在做路由分发的时候 可以给每一个app创建一个名称空间
然后在反向解析的时候 可以选择到底去哪个名称空间中查找别名
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
后端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>
其实上面的名称空间知识点可以完全不用 你只需要保证起别名的时候 在整个django项目中不冲突即可
参考建议
起别名的时候统一加上应用名前缀
urlpatterns = [
url(r'^reg/',views.reg,name='app02_reg')
]
urlpatterns = [
url('^reg/',views.reg,name='app01_reg')
]
伪静态
将一个动态网页伪装成一个静态网页 以此来挺好搜索引擎SEO查询频率和搜藏力度
所谓的搜索引擎其实就是一个也别巨大的爬虫程序
虚拟环境
给每一个项目 装备该项目所需要的模块 不需要的模块一概不装
每创建一个虚拟环境就类似于你重新下载了一个纯净python解释器
之后该项目用到上面 你就装什么(虚拟环境一台机器上可以有N多个)
django版本区别
django1.X ;django2.X
urls.py中路由匹配的方法有区别
django2.X;用的是path
urlpatterns = [
path('admin/', admin.site.urls),
]
django1.X用的是url
urlpatterns = [
url(r'^reg.html',views.reg,name='app02_reg')
]
区别 django2.X里面path第一个参数不是正则也不支持正则 写什么就匹配什么
虽然path不支持正则 感觉也好用 django2.X还有一个re_path的方法 该方法就是django1.X里面url
虽然path不支持正则,但是它提供了五种转换器 能够将匹配到的数据自动转换成对应的类型
除了有默认五种转换器之外 还支持你自定义转换器
django初步--+urls解析的更多相关文章
- django初步了解2
目录 django初步了解2 表的字段增删改查 数据的增删改查 反向解析和分组 路由分发 名称空间 伪静态 虚拟环境 django初步了解2 表的字段增删改查 新增的字段 1.直接提供默认值 defa ...
- django初步了解
目录 学前了解 wsgiref模块( web服务网关接口) 根据不同的功能拆封成不同的py文件 动静态网页 HTTP协议 django初步了解1 1.小白必会三板斧 2.静态文件配置 3.reques ...
- Django的url解析
Django中采用正则表达式来匹配所请求的url,这个叫做URLconf,作为MVC中的C(控制器), 这样再调用相应的试图,达到控制器控制试图的显示的效果. 看一下Django的url解析过程 第一 ...
- Django之逆向解析url
Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图, 获取相应的数据 ...
- django之urls系统
Django的urls系统简介 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映 ...
- Django 的逆向解析url--reverse(转)
https://www.cnblogs.com/zhenfei/p/6368955.html Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个 ...
- Django url反向解析与路由分发名称空间
url反向解析 url.py from django.conf.urls import url from django.contrib import admin from app01 import v ...
- Django之urls.py详解
urls.py:URL分发器(路由配置文件)URL配置(URLconf)就像是Django所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表.你就是以这种方式告诉Dj ...
- django视图函数解析(三)
1 视图views概述 1 作用: 视图接受web请求并响应web请求 2 本质: 视图就是python中的处理函数 3 响应: 一般是一个网页的HTML内容.一个重定向.错误信息页面.json格式的 ...
随机推荐
- OpenStack组件——Glance镜像服务
1.glance介绍 Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找.注册和检索等. Glance提供Restful API可以查询虚拟机镜像的metadata及 ...
- Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)
Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...
- nginx - 反向代理 - 配置文件 header - 日志log格式
server { listen ; server_name paas.service.consul; client_max_body_size 512m; access_log /data/bkdat ...
- servlet学习之servletAPI编程常用的接口和类
ServletConfig接口: SevletConfig接口位于javax.servlet包中,它封装了servlet配置信息,在servlet初始化期间被传递.每一个Servlet都有且只有一个S ...
- [转帖]Windows 下如何配置Oracle ASM???
Windows 下如何配置Oracle ASM??? candon123关注10人评论16725人阅读2011-02-09 21:40:57 本篇介绍了如何在windows下创建裸设备,并创建AS ...
- Python 列表(List)
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型. 一.列表定义 用逗号分隔不同的数据项使用方括号括起来. >>> li ...
- Memcached安装 常用指令
Memcached 源码安装 # 安装依赖yum install -y gcc gcc-c++ automake autoconf make cmake libevent-devel.x86_64# ...
- 安装PIG
下载Pig 能够执行在Hadoop 0.20.* http://mirror.bit.edu.cn/apache/pig/pig-0.11.1/pig-0.11.1.tar.gz 也能够依据你的Had ...
- F12 开发人员工具中的控制台错误消息
使用此参考解释显示在 Internet Explorer 11 的控制台 和调试程序中的错误消息. 简介 使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显 ...
- 105、Replicated Mode VS Global Mode (Swarm12)
参考https://www.cnblogs.com/CloudMan6/p/8028712.html Swarm 可以在 Service 创建和运行过程中灵活的通过 --replicas 调整容器 ...