我正在尝试编写自定义的rest_framework权限,以防止用户查询与他们不属于同一公司的信息.不幸的是,我似乎无法访问任何URL的参数从内部has_permission()或has_object_permissions().
这是我的路由器的开头:
# Create a basic router
router = routers.SimpleRouter()
# Establish some variables to assist with nested routes
root_elem = 'companies'
root_elem_id = '/(?P<company_id>[0-9]+)'
loca_elem = '/locations'
loca_elem_id = '/(?P<location_id>[0-9]+)'
# Companies will be the root from which all other relations branch
router.register(r'' + root_elem, views.CompanyViewSet)
router.register(r'' + root_elem + root_elem_id + loca_elem,
views.LocationViewSet)
Run Code Online (Sandbox Code Playgroud)
这是我的自定义权限:
# Only permit actions originating from location managers or company admins
class IsLocationManagerOrHigher(BasePermission):
# Checked when displaying lists of records …Run Code Online (Sandbox Code Playgroud) 我正在使用SQLite资产助手库来处理设置和升级我的应用程序数据库的肮脏工作.它工作得很好但不幸的是我还没有找到一种方法来通知用户何时库:
A)首次加载数据库(通过从\ assets\databases \文件夹中解压缩)
要么
B)升级数据库(使用\ assets\datates中升级的数据库文件中的信息)
我尝试将此代码放在我的应用程序的主Activity.onCreate()中,以为我可以在主线程上加载数据库(如果它不存在),同时用不可解雇的AlertDialog分散用户的注意力:
File dbFile=this.getDatabasePath("gShoJMDict");
Boolean dbExists = dbFile.exists();
Log.i("ActivityStartScreen", String.valueOf(dbExists));
if(!dbExists)
{
DialogFirstRun dialogFirstRun = new DialogFirstRun();
dialogFirstRun.show(getSupportFragmentManager(), "dialogFirstRun");
dialogFirstRun.setCancelable(false);
DictHelper helper = new DictHelper(this);
helper.getReadableDatabase();
helper.close();
dialogFirstRun.dismiss();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,基于LogCat条目,SQLite资产助手会在onCreate()之前检查数据库是否存在,所以当上面的代码块运行时,数据库已经存在,因此对话框永远不会出现.
我正在使用ContentProvider,并且我已经验证我只是在query()或update()中调用getReadableDatabase().我的ContentProvider的onCreate()看起来像这样......
@Override
public boolean onCreate()
{
// Load our database
gdb = new JMDictHelper(getContext());
return true;
}
Run Code Online (Sandbox Code Playgroud)
...但是尽管移动了gdb = new JMDictHelper(getContext()); 在查询()或更新()之前,SQLite资产助手库仍然可以在我通知用户之前很好地加载数据库.
在这种情况下,我可以做什么来拦截数据库的初始设置或升级,并通知用户应用程序正在忙于执行这些任务?现在,应用程序只是在那里做任何事情,直到库完成 - 这对于测试很好,因为我知道期待它,但是当我准备让应用程序上线时,我不能这样做.
当我在PreferenceFragment中点击一个Preference时,我正试图调出一个DialogFragment.不幸的是,当我在DialogFragment.show()中调用getFragmentManager()时,我收到以下错误:
无法解析方法'show(android.app.FragmentManager,java.lang.String)'
问题是我似乎无法从这个片段中引用android.support.v4.app.FragmentManager.负责这个片段的活动从FragmentActivity延伸,但显然这还不够.我也试过调用getSupportFragmentManager(),但这给了我这个错误:
无法解析方法'getSupportFragmentManager()'
我怎样才能做到这一点?
这是一些代码:
gPrefAcknowledgements.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference preference)
{
DialogAcknowledgements dialogAck = new DialogAcknowledgements();
dialogAck.show(getFragmentManager(), "acknowledgements");
return true;
}
});
Run Code Online (Sandbox Code Playgroud) 我正在编写一个脚本来SELECT查询数据库并解析~33,000条记录.不幸的是,我在cursor.fetchone()/ cursor.fetchall()阶段遇到了问题.
我首先尝试一次迭代光标一条记录,如下所示:
# Run through every record, extract the kanji, then query for FK and weight
printStatus("Starting weight calculations")
while True:
# Get the next row in the cursor
row = cursor.fetchone()
if row == None:
break
# TODO: Determine if there's any kanji in row[2]
weight = float((row[3] + row[4]))/2
printStatus("Weight: " + str(weight))
Run Code Online (Sandbox Code Playgroud)
根据输出printStatus(打印出时间戳加上传递给它的任何字符串),脚本花了大约1秒来处理每一行.这让我相信每次循环迭代时都会重新运行查询(使用LIMIT 1或其他东西),因为在SQLiteStudio [i]和[/]中运行一次相同的查询需要大约1秒钟我]返回所有33,000行.我计算出,按照这个速度,通过所有33,000条记录大约需要7个小时.
我尝试使用cursor.fetchall()代替而不是坐在那里:
results = cursor.fetchall()
# Run through every record, extract the kanji, then query for FK …Run Code Online (Sandbox Code Playgroud) 我正在为我的rest_framework API 编写一些测试,并使用令牌身份验证来保护它。我决定使用 DRF 的APIClient类来模拟来自用户浏览器的调用。
我可以通过点击身份验证端点从 API 中获取令牌,但是当我尝试使用这些令牌来验证对其他端点的任何进一步请求时,我收到一条401 Unauthorized错误消息“无效令牌”。
奇怪的是,我可以复制粘贴完全相同的令牌,并通过 HTTPIE 等方式向完全相同的端点发出成功的手动 GET 请求...
这是我的tests.py:
import json
from rest_framework import status
from rest_framework.test import APIClient
from rest_framework.test import APITestCase
class TestUser(object):
"""
A basic user class to simplify requests to the API
Tokens can be generated by authing as a user to /v1/auth/
"""
def __init__(self, token):
self.client = APIClient()
self.token = token
self.client.credentials(HTTP_AUTHORIZATION='Token ' + token)
def get(self, url):
print("Token: …Run Code Online (Sandbox Code Playgroud) 我在Immersive Sticky Mode中的片段布局有问题.系统栏和导航栏正确消失,但片段布局不会拉伸以填充之前占据的那些栏.
这是一个屏幕截图,展示了我在说什么:

红色是活动的背景,蓝色是片段的背景.
这就是我如何启动沉浸式粘滞模式(来自Activity,就在它加载片段之前):
public void startImmersiveMode()
{
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
Run Code Online (Sandbox Code Playgroud)
如何让Fragment扩展以涵盖活动?
编辑 - 这是一些XML:
活动:
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/red"/>
Run Code Online (Sandbox Code Playgroud)
分段:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container_view"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)