标签:self 常用标签 关系 ret 排序 之间 语言 移除 post
框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单说就是使用别人搭好的舞台,你来做表演。
Full-Stack Frdmeworks(全栈框架、重量级框架):Django,web2py、TurboGears.Pylons..…Non Full-Stack Frameworks(非全栈框架、轻量级的框架):tornado、Flask、Bottle、web.py、Pyramid、…
1、根据项目需求去选择。
内容支撑 djangoapp网络接口
2、根据框架的特点去选择
django、tornado、flask、bottletornado 性能高
django-admin.py <subcommand>[options]manage.py <subcommand> [options]subcommand是子命令;options是可选的常用子命令:
startproject:创建一个项目(*)startapp:创建一个app(*)runserver:运行开发服务器(*)shell:进入django shell(*)dbshell:进入django dbshellcheck:检查django项目完整性flush:清空数据库compilemessages:编译语言文件makemessages:创建语言文件makemigrations:生成数据库同步脚本(*)migrate:同步数据库(*)showmigrations:查看生成的数据库同步脚本(*)sqlflush:查看生成清空数据库的脚本(*)sqlmigrate:查看数据库同步的sql语句(*)dumpdata:导出数据loaddata:导入数据diffsettings:查看你的配置和django默认配置的不同之处manage.py特有的一些子命令:
createsuperuser:创建超级管理员(*)changepassword:修改密码(*)clearsessions:清除session
10分钟快速搭建一个查询用户列表的页面。注册app到配置文件第一步,在views.py里面定义一个业务请求处理的函数第二步,定义一个模板并引入静态文件第三步,在urls.py里面定义url地址第四步,启动服务第五步,把用户数据查询出来并渲染到页面上
1、目前模板和静态文件都是放在app的目录下面的,如果我想把模板目录和静态文件放到项目根目录下怎么做;2、目前我app的url是直接定义在工程目录下的urls.py下面的,我想定义到app下面的urls.py可以怎么做?3、想想模板渲染的过程,静态文件引入的标签最终变成什么了?
manage.py:命令行工具脚本hello_django(project):
settings.py:项目配置urls.py:URL配置wsgipy:WSGI配置
hello(app):
migrations:数据库同步脚本目录admin.py:admin配置apps.py:app配置models.py:模型代码tests.py:单元测试views.py:业务代码
1、目前模板和静态文件都是放在app的目录下面的,如果我想把模板目录和静态文件放到项目根目录下怎么做;2、目前我app的url是直接定义在工程目录下的urls.py下面的,我想定义到app下面的urls.py可以怎么做?3、想想模板渲染的过程,静态文件引入的标签最终变成什么了?
所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面面,控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:
M代表模型(Model):负责业务对象和数据库的关系映射(ORM)。T代表模板(Template):负责如何把页面展示给用户(html)。V代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
1,Web服务器(中间件)收到一个http请求2,Django在URLconf里查找对应的视图(View)函数来处理http请求3,视图函数调用相应的数据模型来存取数据、调用相应的模板向用户展示页面4,视图函数处理结束后返回一个http的响应给Web服务器5,Web服务器将响应发送给客户端
urlpatterns=[ur1(r‘hel1o/$",views.hel1o)]
from django.conf.urls import url,patternsfrom hello import viewsurlpatterns = patterns(",(r‘^hello/$‘,views.hello),)或者from django.conf.urls import patternsurlpatterns = patterns(‘hello‘,(r‘^hello/$‘,‘views.hello‘),)
*一个正则表达式字符串。*一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串[1.10后被遗弃已经不再使用]。*可选的要传递给视图函数的默认参数(字典形式)。*一个可选的name参数。*路径前缀[被遗弃]
url(r‘^hello/‘,‘views.hello‘,{‘a‘:‘123‘},‘hello‘,‘hello‘),url(r‘^test/(?P<id>\d{2})/(?P<key>\w+)/$‘,‘hello.views.test‘)
url(r‘^test/\d{2}/$‘,views.test)url(r‘^test/(?P<id>\d{2})/$‘,views.test)url(r‘^test2/(?P<id>\d{2})/(?P<key>\w+)/$‘,views.test)
http请求:HttpRequesthttp响应:HttpResponse
if request.method==‘GET‘:do_something()elif request.method ==‘POST‘:do_something_else()
服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method=="POST"(参见本表的method属性)。注意:POST不包括file-upload信息。参见FILES属性。
type="file"name=""/>标签中name属性的值.FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys:·filename:上传文件名,用Python字符串表示·content-type:上传文件的Content type·content:上传文件的原始内容注意:只在请求方法是POST,并且请求页面中<form>有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES是一个空字典。
·CONTENT_LENGTH·CONTENT_TYPE·QUERY_STRING:未解析的原始查询字符串·REMOTE_ADDR:客户端IP地址·REMOTE_HOST:客户端主机名·SERVER_NAME:服务器主机名·SERVER_PORT:服务器端口META中这些头加上前缀HTTP_最为Key,例如:·HTTP_ACCEPT_ENCODING·HTTP_ACCEPT_LANGUAGE·HTTP_HOST:客户发送的HTTP主机头信息·HTTP_REFERER:referring页·HTTP_USER_AGENT:客户端的user-agent字符串·HTTP_X_BENDER:X-Bender头信息
django.contrib.auth.models.AnonymousUser的实例。你可以通过user的is_authenticated()方法来辨别用户是否登录:if request.user.is_authenticated():#Do something for logged-in users.else:#Do something for anonymous users.只有激活Django中的AuthenticationMiddleware时该属性才可用
session支持时该属性才可用。参见第12章。
"/music/bands/the_beatles/?print=true"
在HttpRequest对象中,GET和POST属性是django.http.QueryDict类的实例。
是全URL(e.g.,http://search.yahoo.com/")或者相对URL(e.g.,"/search/").注意:这将返回HTTP状态码302
重定向(HTTP状态码301)。
from django.http import HttpResponsefrom django.template import loaderdef my_view(request):# View code here...t=loader.get_template(‘ myapp/index. html‘)c={‘foo‘:‘ bar‘}return HttpResponse(t. render(c, request),content_type="application/xhtml+xml")
MySQLdb:https://pypipython.org/pypi/MySQL-python/1.2.5mysqlclient:https://pypipython.org/pypi/mysqlclientMySQLConnector/Python: https://dev.mysql.com/downloads/connector/pythonPyMySQL(纯python的mysq区动):https://pypi.python.org/pypi/PyMysQL
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘: ‘hello_django_db‘,
‘USER‘: ‘root‘,
‘PASSWORD‘: ‘1234‘,
# ‘HOST‘: ‘‘,
# ‘PORT‘: ‘‘,
}
}
对象关系映射(英语:Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。换句话说,就是用面向对象的方式去操作数据库的创建表,增加、修改、删除、查询等操作。
A、使用QuerySet中的query属性B、配置日志系统,将sql显示到控制台
django日志的详细使用详见:https://docs.djangoproject.com/en/2.1/topics/logging/
C、使用一些开发工具,django_debug_toolbar。
STATIC_URL = ‘/static/‘
STATICFILES_DIRS = (
os.path.join(BASE_DIR, ‘static‘),
)
LOGGING = {
‘version‘: 1,
‘disable_existing_loggers‘: False,
‘handlers‘: {
‘console‘:{
‘level‘:‘DEBUG‘,
‘class‘:‘logging.StreamHandler‘,
},
},
‘loggers‘: {
‘django.db.backends‘: {
‘handlers‘: [‘console‘],
‘propagate‘: True,
‘level‘:‘DEBUG‘,
},
}
}
1、ORM使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。2、可以避免一些新手程序猿写sql语句带来的性能效率和安全问题。
1、性能有所牺牲,不过现在的各种ORM框架都在尝试使用各种方法来减轻这个问题(LazyLoad,Cache),效果还是很显著的。2、对于个别复杂查询,ORM仍然力不从心。为解决这个问题,ORM框架一般也提供了直接写原生sql的方式。
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名称")
address = models.CharField("地址", max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
verbose_name = ‘出版商‘
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=30)
class AuthorDetail(models.Model):
sex = models.BooleanField(max_length=1, choices=((0, ‘男‘),(1, ‘女‘),))
email = models.EmailField()
address = models.CharField(max_length=50)
birthday = models.DateField()
author = models.OneToOneField(Author)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
1、每个数据模型都是django.db.models.Model的子类。它的父类Model包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。2、每个模型相当于单个数据库表(这条规则的例外情况是多对多关系,多对对关系的时候会多生成一张关系表),每个属性也是这个表中的一个字段。属性名就是字段名,它的类型(例如 CharField)相当于数据库的字段类型(例如varchar)。大家可以留意其他的类型都和数据库里面的什么字段类型对应。
1、BooleanField:布尔类型字段2、CharField:字符串类型字段3、DateField:日期字段4、DateTimeField:日期时间字段5、DecimalField:(精确)小数字段6、EmailField:Email字段7、FileField:文件字段(保存和处理上传的文件)8、FloatField:(浮点数)小数字段9、ImageField:图片字段(保存和处理上传的图片)10、IntegerField:整数字段11、IPAddressField:IP字段12、SmalIntegerField:小整数字段13、TextField:文本字段14、URLField:网页地址字段
1、null(null=TruelFalse)数据库字段的设置是否可以为空(数据库进行验证)2、blank(blank=TruelFalse)字段是否为空django会进行效验(表单进行验证)3、choices 轻量级的配置字段可选属性的定义4、default 字段的默认值5、help_text 字段文字帮助6、primary_key(=TruelFalse)一般情况不需要进行定义是否主键,如果没有显示指明主键的话,django会自动增加一个默认主键:id=models.AutoField(primary_key=True)7、unique 是否唯一,对于数据表而言。8、verbose_name 字段的详细名称,如果不指定该属性,默认使用字段的属性名称
name = models.CharField(max_length=30, verbose_name="名称") #不指明,则显示name
address = models.CharField("地址", max_length=50) # 简便的设置
通过内部类Meta给数据模型类增加扩展属性:class Meta:verbose_name=名称’verbose_name_plural=‘名称复数形式’ordering=[‘排序字段]还有很多扩展属性,更多详见:
定义模型方法和普通python类方法没有太大差别,定义模型方法可以将当前对应的数据,组装成具体的业务逻辑。示例:定义__unicode__()让对象有个默认的名字注意:python2里面用_unicode_(),python3里面用_str_()def_str_(self):return self.name
表中的字段:app:app名字name:脚本的文件名称applied:脚本执行的时间
flush:清空数据库-恢复数据库到最初状态不记录日志makemigrations:生成数据库同步的脚本 可以加app 操作单个同步app , makemigrations hellomigrate:同步数据库(*)showmigrations:查看生成的数据库同步脚本(*) [X] 表示已经执行sqlflush:查看生成清空数据库的脚本(*)sqlmigrate:查看数据库同步的sql语句(*)
在开发的过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的方法,一是去分析生成的数据库脚本和django_migrations中的同步记录是否匹配,另外一个简单粗暴的方法就是把migrations目录下的脚本(除_init__.py)之外全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。
Publisher.objects.filter(name=‘广东人民出版社‘).aggregate(Count(‘name‘)){‘name__count‘: 1}Publisher.objects.filter(name=‘广东人民出版社‘).aggregate(mycpunt=Count(‘name‘)){‘mycpunt‘: 1}
这种方式完全不依赖model,前面两种方式还是要依赖于model来看一些实例:
使用extra:1、Book.objects.filter(publisher_name=‘广东人民出版社).extra(where=Book.objects.filter(publisher_name=‘广东人民出版社”,price_gt=50)>>>Book.objects.extra(select={‘count‘:‘select count(*) from hello_book‘})(0.001) SELECT(select coun(x) from hello_book) AS count,"hello_book. id‘,hello_book. title‘,"hello_book‘."publisher_id‘, hello_book‘."publication_date, hello_book. priceFROM hello_book‘ LIMIT 21; args=()[<Book: Book object>,<Book: Book object>,<Book: Book object〉,<Book: Book objest>,<Book: Book object>]>>>Book.objects.raw(‘select * from hello_book‘)<RawQuerySet:select x from hello_book>>>>bbb=Book.objects.raw(‘select x from hello_book")>>>for b in bbb:~print(b.title)(0.001)select x from hello_book;args=()|Python开发实战|论撩妹的重要性|Java开发实战|web开发从入门到放弃|21天成为撩妹高手
{{ ship_date|date:"Fj,Y" }},ship_date变量传给data过滤器,data过滤器通
a.forloop.counter 当前循环计数,从1开始b.forloop.counter0 当前循环计数,从0开始,标准索引方式c.forloop.revcounter 当前循环的倒数计数,从列表长度开始d.forloop.revcounterO当前循环的倒数计数,从列表长度减1开始,标准e.forloop.first bool值,判断是不是循环的第一个元素f.forloop.last 同上,判断是不是循环的最后一个元素g.forloop.parentloop 用在嵌套循环中,得到parent循环的引用,然后可以使用以上的参数
from django.shortcuts import render, render_to_response, redirectfrom django.contrib.auth.models import Userfgom django.http import HttpRequest, HttpResponsefrom django.template import loader, RequestContextreturn render_to_response(‘tabre.html‘, locals(), context_instance=RequestContext(request))
{% filter force_escape | upper %}This text will be HTML-escaped, and will appear in all lowercase.{% endfilter%}{{ value | upper}} # 通过变量调用过滤器
{% autoescape off%} [变量可以渲染显示标签元素,而不是转义成别的]{{value5}}(% endautoescape %}
{% with total=fdsafsdafdsafdsfadsfafdsa %}{{ total}}{%endwith%}
{{ valuelcut:""}}If value is "string with spaces", the output willbe "stringwithspaces".
1、使用register的方法2、使用register的装饰器
list_display:指定要显示的字段search_fields:指定搜索的字段list_filter:指定列表过滤器ordering:指定排序字段fields\exclude:指定编辑表单需要编辑\不需编辑的字段fieldsets:设置分组表单
from django.contrib import adminfrom hello.models import*@admin.register(Publisher)class PublisherAdmin(admin.ModelAdmin):1ist_display=‘name‘,‘country‘,‘state province‘,‘city‘,)admin.site.register(Author)admin.site.register(AuthorDetail)# admin.site.register(Publisher, PublisherAdmin)admin.site.register(Book)
(None,{
fields‘:(‘ url‘,‘ title‘,‘ content‘,‘ sites‘)
}),(Advanced options‘,{
‘ classes‘:(‘ collapse‘,),fields‘:(‘ registration_required",‘ template_name‘),
}),
from django import formsclass PublisherForm(forms.Form): # 标签内容name = forms.CharField(label="名称", error_messages={"required": "这个项必须填写"})
address = forms.CharField(label="地址", error_messages={"required": "这个项必须填写"})
city = forms.CharField(label="城市", error_messages={"required": "这个项必须填写"})
state_province = forms.CharField(label="省份", error_messages={"required": "这个项必须填写"})
country = forms.CharField(label="国家", error_messages={"required": "这个项必须填写"})
website = forms.URLField(label="网址", error_messages={"required": "这个项必须填写"})#view.py 接受校验使用Django Form的情况。
publisher_form = PublisherForm(request.POST)
if publisher_form.is_valid():
Publisher.objects.create(
name = publisher_form.cleaned_data[‘name‘],
address = publisher_form.cleaned_data[‘address‘],
city = publisher_form.cleaned_data[‘city‘],
state_province = publisher_form.cleaned_data[‘state_province‘],
country = publisher_form.cleaned_data[‘country‘],
website = publisher_form.cleaned_data[‘website‘],
)
return HttpResponse("添加出版社信息成功!")
else:
publisher_form = PublisherForm()
return render(request, ‘add_publisher.html‘, locals())
class PublisherForm(forms.ModelForm):
class Meta:
model = Publisher #关联的表
exclude = ("id",) #排除的字段
#view.py
publisher_form = PublisherForm(request.POST)
if publisher_form.is_valid():
publisher_form.save() # 直接保存
return HttpResponse("添加出版社信息成功!")
def validate_name(value):
try:
Publisher.objects.get(name=value)
raise ValidationError("%s的信息已经存在"%value)
except Publisher.DoesNotExist:
pass
name = forms.CharField(label="名称", validators=[validate_name])
def clean_name(self):
value = self.cleaned_data.get(‘name‘)
try:
Publisher.objects.get(name=value)
raise ValidationError("%s的信息已经存在" % value)
except Publisher.DoesNotExist:
pass
return value # 没有错误要返回
# 三、表单clean方法,可针对整个表单进行验证。
def clean(self):
cleaned_data = super(PublisherForm, self).clean()
value = cleaned_data.get(‘name‘)
try:
Publisher.objects.get(name=value)
self._errors[‘name‘]=self.error_class(["%s的信息已经存在" % value]) #单独指定错误信息
except Publisher.DoesNotExist:
pass
return cleaned_data
标签:self 常用标签 关系 ret 排序 之间 语言 移除 post
原文地址:https://www.cnblogs.com/wenyule/p/9901657.html